MongoDB: comment trouver 10 aléatoire document dans une collection de 100?
MongoDB est capable de financement nombre de documents aléatoires sans faire plusieurs requêtes?
par exemple, j'ai mis en place sur le JS côté après le chargement de tous les documents dans la collection, qui est un gaspillage, donc juste voulu vérifier si cela peut être fait mieux avec un db requête?
Le chemin que j'ai pris le JS côté:
- obtenir toutes les données
- faire un tableau des Id
- shuffle tableau des Id (ordre aléatoire)
- raccord au tableau pour le nombre de documents requis
- créer une liste de document en les sélectionnant à l'ID qui nous ont quitté après deux opérations précédentes, un par un à partir de l'ensemble de la collection
Deux inconvénient majeur est que je suis le chargement de toutes les données - ou je fais plusieurs requêtes.
Toute suggestion beaucoup apprécié
Est-il vraiment juste 10 documents de 100? Si oui, alors pourquoi optimiser si la solution fonctionne?
Eh bien, c'est juste un exemple, j'attends la collection de croître dans 1000s
Eh bien, c'est juste un exemple, j'attends la collection de croître dans 1000s
OriginalL'auteur Iladarsda | 2014-07-17
Vous devez vous connecter pour publier un commentaire.
Ce fut répondu il y a longtemps et, depuis lors, MongoDB a grandement évolué.
Posté dans une autre réponse, MongoDB prend désormais en charge l'échantillonnage dans le Cadre de l'Agrégation depuis la version 3.2:
La façon dont vous pourriez faire c'est:
Ou:
Cependant, il y a quelques mises en garde sur le $de l'échantillon de l'opérateur:
(de Novembre, 6h 2017, où la dernière version 3.4) => Si ce n'est pas remplie:
Comme dans le dernier exemple en date avec le $match
VIEILLE RÉPONSE
Vous pouvez toujours exécuter:
Mais l'ordre ne sont pas être aléatoire et vous aurez besoin de deux requêtes (un chef d'accusation pour obtenir YOUR_COLLECTION_SIZE) ou d'estimer comment elle est grande (il est d'environ 100 dossiers, environ 1000, environ 10000...)
Vous pouvez également ajouter un champ à tous les documents avec un nombre aléatoire et de la requête par le nombre. L'inconvénient serait que vous obtiendrez les mêmes résultats à chaque fois que vous exécutez la même requête. Pour corriger cela, vous pouvez toujours jouer avec la limite et de sauter ou même avec tri. vous pourriez aussi bien mettre à jour ces nombres aléatoires chaque fois que vous récupérez un dossier (qui implique plus de requêtes).
--Je ne sais pas si vous utilisez la Mangouste, le Mondoid ou directement le Mongo Chauffeur pour n'importe quelle langue spécifique, alors je vais écrire tout à propos de shell mongo.
Ainsi votre, disons, enregistrement de produit devrait ressembler à ceci:
et je dirais à utiliser:
Alors que vous pourriez faire:
ensuite, vous pouvez exécuter périodiquement afin de mettre à jour le document de _random_sample terrain périodiquement:
ou tout simplement chaque fois que vous récupérez quelques enregistrements que vous pourriez mettre à jour tous ou seulement quelques-uns (en fonction du nombre d'enregistrements que vous avez récupéré)
MODIFIER
Être conscient que
ne fonctionne pas très bien, car il mettra à jour tous les produits qui correspond à votre requête avec la même nombre aléatoire. La dernière approche qui fonctionne le mieux (la mise à jour de certains documents que vous les récupérer)
OriginalL'auteur Enrique Fueyo
Depuis 3.2 il y a un moyen plus facile d'obtenir un échantillon aléatoire de documents à partir d'une collection:
Source: MongoDB Docs
Dans ce cas:
OriginalL'auteur Daniel Budick
Ici est ce que je suis venu jusqu'à la fin:
OriginalL'auteur Iladarsda
ignorer cela ne fonctionnait pas pour moi. Voici ce que je me suis retrouvé avec:
obtient un seul résultat aléatoire, correspondant aux critères.
OriginalL'auteur Marc