Prove um grande banco de dados CouchDB para desenvolvimento local, evitando construções de visão longa

StackOverflow https://stackoverflow.com/questions/3604158

  •  25-09-2019
  •  | 
  •  

Pergunta

O CouchDB é conveniente para desenvolver (couchapps) localmente e depois empurrar para a produção remota. Infelizmente, com conjuntos de dados do tamanho de produção, trabalhar em visualizações pode ser complicado.

Quais são as boas maneiras de pegar amostras de um banco de dados CouchDB para uso no desenvolvimento local?

Foi útil?

Solução

A resposta é replicação filtrada. Eu gosto de fazer isso em duas partes:

  1. Replicar o banco de dados de produção, example_db para o meu servidor local como example_db_full
  2. Executar a replicação filtrada de example_db_full para example_db, onde o filtro corta dados suficientes para que as compilações sejam rápidas, mas mantém dados suficientes para que eu possa confirmar que meu código funciona.

Quais documentos a serem selecionados podem ser específicos do aplicativo. Neste momento, estou satisfeito com um passe aleatório simples/falha com uma porcentagem que posso especificar. A aleatoriedade é consistente (ou seja, o mesmo documento sempre passa ou sempre falha.)

Minha técnica é normalizar a soma de verificação de conteúdo no documento _rev campo em uma faixa de [0,0, 1,0). Então eu simplesmente especifica alguma fração (por exemplo 0.01), e se o valor normalizado da soma de verificação for <= minha fração, o documento passa.

function(doc, req) {
  if(/^_design\//.test(doc._id))
    return true;

  if(!req.query.p)
    throw {error: "Must supply a 'p' parameter with the fraction"
                  + " of documents to pass [0.0-1.0]"};

  var p = parseFloat(req.query.p);
  if(!(p >= 0.0 && p <= 1.0)) // Also catches NaN
    throw {error: "Must supply a 'p' parameter with the fraction of documents"
                  + " to pass [0.0-1.0]"};

  // Consider the first 8 characters of the doc checksum (for now, taken
  // from _rev) as a real number on the range [0.0, 1.0), i.e.
  // ["00000000", "ffffffff").
  var ONE = 4294967295; // parseInt("ffffffff", 16);
  var doc_val = parseInt(doc._rev.match(/^\d+-([0-9a-f]{8})/)[1], 16);

  return doc_val <= (ONE * p);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top