Maison > Questions et réponses > le corps du texte
在MySQL中,可以通过下面的语句简单的获取随机的5条记录:
SELECT * FROM `table` ORDER BY RAND() LIMIT 5
但是在MongoDB下,没有找到rand()
方法,而且ObjectID
也不是MySQL那样整数的,不好随机,不知道大家有什么好办法?
巴扎黑2017-04-21 10:58:15
Il y a actuellement une discussion sur l'opportunité d'ajouter cette fonctionnalité : https://jira.mongodb.org/browse/SERVE..., mais il ne semble y avoir aucun progrès substantiel pour le moment.
En fait, MySQL crée simplement une table temporaire, génère un nombre aléatoire pour toutes les lignes candidates, puis trie le nombre aléatoire pour obtenir les résultats dont vous avez besoin.
Dans MongoDB, vous devez créer vous-même un tel attribut de tri pour doc. La valeur de cet attribut peut être un nombre aléatoire, tiré du livre de recettes :
db.docs.save( { key : 1, ..., random : Math.random() } )
Lors d'une recherche, calculez un nombre aléatoire, puis accédez à l'attribut de tri pour trouver celui qui s'en rapproche le plus, mais pensez à ajouter un index à l'attribut de tri :
rand = Math.random() cmp = Math.random() result = db.docs.findOne( { key : 2, random : { $gte : rand } } ) if ( result == null ) { result = db.docs.findOne( { key : 2, random : { $lte : rand } } ) }
Comme la valeur de l'attribut de tri n'est pas dynamique comme dans MySQL, si vous souhaitez obtenir plusieurs documents de manière vraiment aléatoire, vous devez boucler l'opération ci-dessus.
Je pense que la racine de ce problème est de savoir si le caractère aléatoire au sens mathématique est nécessaire. Si vous voulez juste une idée approximative, pour de grandes quantités de données sans indexation, vous pouvez utiliser Map/Reduce pour améliorer la vitesse de convergence.
Ainsi, en fait, les horodatages peuvent également être utilisés. Tout attribut capable de trouver les valeurs limites supérieure et inférieure sans trop de valeurs répétées peut être utilisé pour un tri aléatoire.
ringa_lee2017-04-21 10:58:15
Ajouter des conditions
"$where":function () { if(Math.random()>0.1){return true;}else{return false;}}
Coopérer avec limit(1)
Sélectionnez au hasard un enregistrement dans l'ensemble avec une probabilité de 1/10
C’est peut-être plus simple, mais son application est plus limitée. Pour référence seulement~