2010-05-09 6 views

Répondre

8

Je me suis débrouillé en utilisant Math.random() dans ma clé de vue. Mais vous devez comprendre que ce sera déterministe, donc vous ne pouvez pas l'utiliser pour le hasard dans votre application (juste pour des choses comme l'échantillonnage des données, ou la division d'une base de données.)

+3

Peut-être une amélioration serait d'émettre 'doc._rev.match (/^\ d + - (\ w +) $ /) [1]', c'est-à-dire la partie checksum de la propriété de révision? – JasonSmith

7

Une stratégie de base est:

  1. magasin une valeur aléatoire dans le document

    { "_id": "7a36b03f3f2899064a1db5e0a6004204", 
        "random": 0.875111079382808 
    } 
    

    Vous pouvez calculer random lorsque vous enregistrez le document ou utilisez une fonction _update pour l'ajouter pour vous .

  2. Créez une vue saisie sur cette valeur, en la mélangeant efficacement.

    { "_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. Choisissez un nombre aléatoire au moment de la requête, par ex. 0,4521 et GET /db/_design/myapp/_view/random_docs?limit=1&startkey=0.4521.

Il y a une chance (1/total_rows) que vous choisissiez un nombre aléatoire supérieur à n'importe quel dans la vue. Donc, si vous devez être à l'épreuve des balles, vous devriez réexécuter la requête si vous obtenez 0 lignes.

+2

Et peut-être, utilisez un paramètre endkey aussi, pour évitez de réexécuter la requête. –

+0

Bon point. Merci! – JasonSmith

Questions connexes