Il existe un certain nombre de questions et de réponses concernant l'ordre aléatoire des résultats ou l'obtention aléatoire d'un seul enregistrement. Les réponses recommandent d'ajouter un champ aléatoire, de créer un index sur ce champ, puis de faire un tirage au sort. Il ressemble à:Comment ajouter en vrac un champ aléatoire à chaque enregistrement dans MongoDB
db.myindex.find().forEach(function(doc) {
db.myindex.update({_id: doc._id}, {$set: {rand: Math.random()}})
})
Cela fonctionne très bien, mais cela prend plusieurs heures (beaucoup, beaucoup de données). Cela semble limité par le verrouillage d'écriture, ce qui est logique puisque la mise à jour est en cours pour chaque enregistrement. Comment est-ce que je fais cela en vrac? J'ai essayé:
var bulk = db.myindex.initializeUnorderedBulkOp();
bulk.find({}).update({ $set: { rand: Math.random() } });
bulk.execute();
Mais il définit le champ rand à la même valeur pour chaque enregistrement! Comment puis-je réparer ça? En passant, la raison pour laquelle je dois faire ceci est parce que je reçois un énorme fichier bson de quelqu'un d'autre et j'ai besoin de l'importer fréquemment, donc je ne peux pas attendre plusieurs heures pour le mettre à jour.
peut-être attendez-vous un peu à la version 3.2, alors vous pouvez utiliser l'opérateur '$ sample': https://docs.mongodb.org/manual/release-notes/3.2-reference/ – nickmilon