2010-05-09 14 views

risposta

8

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.)

+3

Forse un miglioramento sarebbe quello di emettere 'doc._rev.match (/^\ d + - (\ w +) $ /) [1]', cioè la parte di checksum della proprietà di revisione? – JasonSmith

7

Una strategia di base è:

  1. 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 .

  2. 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); 
         } 
         } 
        } 
        } 
    } 
    
  3. 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.

+2

E forse, usare anche un parametro endkey, per evitare di rieseguire la query. –

+0

Buon punto. Grazie! – JasonSmith