Dégustez une grande base de données CouchDB pour le développement local, en évitant vision à long construit

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

  •  25-09-2019
  •  | 
  •  

Question

CouchDB est pratique pour développer (CouchApps) localement, puis pousser la production à distance. Malheureusement, avec des ensembles de données de production moyenne, travaillant sur des points de vue peut être lourd.

Quelles sont les bonnes façons de prélever des échantillons d'une base de données CouchDB pour une utilisation dans le développement local?

Était-ce utile?

La solution

La réponse la réplication est filtrée. J'aime le faire en deux parties:

  1. Répliquer la base de données de production, example_db à mon serveur local comme example_db_full
  2. Effectuer la réplication filtrée de example_db_full à example_db, où le filtre découpe suffisamment de données construit ainsi sont rapides, mais conserve suffisamment de données pour que je puisse confirmer mon code fonctionne.

Quels documents pour sélectionner peuvent être spécifiques à l'application. A cette époque, je suis satisfait d'une simple passe aléatoire / échec avec un pourcentage que je peux préciser. Le caractère aléatoire est cohérente (à savoir, le même document passe toujours ou ne fait pas toujours.)

Ma technique consiste à normaliser la somme de contrôle de contenu dans le document champ _rev sur une plage de [0.0, 1.0). Ensuite, je Désignez simplement une fraction (par exemple 0.01), et si la valeur de contrôle est normalisée <= ma fraction, le document passe.

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top