nosql - MongoDB如何随机获取若干条记录
黄舟
黄舟 2017-04-21 10:56:15
0
2
731

在MySQL中,可以通过下面的语句简单的获取随机的5条记录:

SELECT * FROM `table` ORDER BY RAND() LIMIT 5

但是在MongoDB下,没有找到rand()方法,而且ObjectID也不是MySQL那样整数的,不好随机,不知道大家有什么好办法?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

répondre à tous(2)
巴扎黑

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.

左手右手慢动作

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~

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal