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 :
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~
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 :
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 :
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~