Esempio di un ampio database CouchDB per lo sviluppo locale, evitando vista lunga costruisce
-
25-09-2019 - |
Domanda
CouchDB è conveniente per lo sviluppo (CouchApps) a livello locale e poi spingere in produzione a distanza. Purtroppo con insiemi di dati di produzione dimensioni, lavorando sulle viste può essere ingombrante.
Quali sono buoni modi per prelevare campioni di un database CouchDB per l'uso in sviluppo locale?
Soluzione
La risposta è filtrata replica. Mi piace farlo in due parti:
- replicare il database di produzione,
example_db
al mio server locale comeexample_db_full
- eseguire la replica filtrata da
example_db_full
aexample_db
, dove i tagli filtrare i dati sufficienti costruisce così sono veloci, ma mantiene abbastanza dati in modo da poter confermare i miei lavori di codice.
Quali documenti per selezionare può essere specifica dell'applicazione. In questo momento, sono soddisfatto con un semplice passaggio casuale / fail con una percentuale che posso specificare. La casualità è coerente (cioè, lo stesso documento passa sempre o fallisce sempre.)
La mia tecnica è di normalizzare il checksum contenuto nel campo _rev
documento su una serie di [0.0, 1.0). Poi ho semplicemente specificare alcune frazioni (ad esempio 0.01
), e se il valore di checksum normalizzato è <= mia frazione, il 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);
}