2010-08-30 30 views
2

CouchDB est pratique pour développer (CouchApps) localement et ensuite pousser dans la production à distance. Malheureusement, avec des ensembles de données de la taille d'une production, travailler sur des vues peut être fastidieux. Quels sont les bons moyens de prélever des échantillons d'une base de données CouchDB pour une utilisation dans le développement local?Échantillonnage d'une grande base de données CouchDB pour le développement local, évitant les longues vues

Répondre

2

La réponse est la réplication 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 example_db_full-example_db, où le filtre découpe suffisamment de données Builds sont donc rapides, mais garde assez de données pour que je puisse confirmer que mon code fonctionne.

Les documents à sélectionner peuvent être spécifiques à l'application. À ce moment, je suis satisfait d'un simple passage/échec aléatoire avec un pourcentage que je peux spécifier. Le caractère aléatoire est cohérent (c.-à-d. Le même document réussit ou échoue toujours.)

Ma technique consiste à normaliser la somme de contrôle du contenu dans le champ _rev du document sur une plage de [0.0, 1.0). Ensuite, je spécifie simplement une fraction (par exemple 0.01), et si la valeur de somme de contrôle normalisée est < = 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); 
} 
+0

Il me vient à l'esprit que mon implémentation finale n'a pas la propriété 0.0, 1.0 de mon idée initiale. Vraiment, c'est 00 ... - ff ... entiers hexadécimaux. Mais le principe est le même. – JasonSmith