J'ai besoin d'une requête aléatoire, mais je ne sais pas quelle est la meilleure façon de le faire dans la vue.Commander par Rand - Comment faire pour CouchDB?
Répondre
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.)
Une stratégie de base est:
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 .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); } } } } }
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.
Et peut-être, utilisez un paramètre endkey aussi, pour évitez de réexécuter la requête. –
Bon point. Merci! – JasonSmith
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