Ho bisogno di una query casuale, ma non so qual è il modo migliore per farlo nella vista.Ordina per Rand - Come posso fare in CouchDB?
risposta
Ho ottenuto con Math.random() nella mia chiave di visualizzazione. Ma devi capire che sarà deterministico, quindi non puoi usarlo per casualità nella tua app (solo per cose come campionare dati o dividere un database.)
Una strategia di base è:
Conservare un valore casuale nel documento
{ "_id": "7a36b03f3f2899064a1db5e0a6004204", "random": 0.875111079382808 }
è possibile calcolare
random
quando si memorizza il documento o utilizzare una funzione_update
per aggiungerlo per voi .Impostare una vista su tale valore, mescolandoli in modo efficace.
{ "_id": "_design/myapp", "comment": "Function left naked for clarity; it should be a string", "views": { "random_docs": { "map": function(doc) { if(doc.random) { emit(doc.random, doc); } } } } }
Scegliere un numero casuale al momento della richiesta, ad es. 0,4521 e GET
/db/_design/myapp/_view/random_docs?limit=1&startkey=0.4521
.
C'è una possibilità (1/total_rows) di scegliere un numero casuale maggiore di qualsiasi nella vista. Quindi se hai bisogno di essere a prova di proiettile, dovresti rieseguire la query se ottieni 0 righe.
E forse, usare anche un parametro endkey, per evitare di rieseguire la query. –
Buon punto. Grazie! – JasonSmith
Forse un miglioramento sarebbe quello di emettere 'doc._rev.match (/^\ d + - (\ w +) $ /) [1]', cioè la parte di checksum della proprietà di revisione? – JasonSmith