Si vous avez besoin de renvoyer un petit échantillon de documents aléatoires d'une collection, voici trois approches que vous pouvez essayer en utilisant le pipeline d'agrégation.
Le $sample
Étape
Le $sample
L'étape de pipeline d'agrégation est conçue spécifiquement pour sélectionner au hasard un nombre spécifié de documents.
Lorsque vous utilisez $sample
, vous spécifiez le nombre de documents que vous souhaitez renvoyer dans une size
champ.
Supposons que nous ayons la collection suivante appelée pets
:
{ "_id" :1, "name" :"Wag", "type" :"Chien", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Chien", "poids" :10 }{ "_id" :3, "nom" :"Miaou", "type" :"Chat", "poids" :7 }{ "_id" :4, "nom" :"Scratch", "type" :"Chat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Bat", "weight" :3 }{ " _id" :6, "name" :"Hop", "type" :"Kangaroo", "weight" :130 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :8, "name" :"Snap", "type" :"Crocodile", "weight" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Colibri", "poids" :1 }
Nous pouvons utiliser $sample
pour récupérer un échantillon aléatoire de ces documents comme celui-ci :
db.pets.aggregate( [ { $échantillon :{ taille :3 } } ])
Résultat :
{ "_id" :1, "name" :"Wag", "type" :"Chien", "weight" :20 }{ "_id" :5, "name" :"Bruce", "type" :"Chauve-souris", "poids" :3 }{ "_id" :3, "nom" :"Miaou", "type" :"Chat", "poids" :7 }
Dans ce cas, j'ai spécifié { size: 3 }
qui a renvoyé trois documents.
Ici, il utilise à nouveau une taille d'échantillon différente :
db.pets.aggregate(
[
{
$sample: { size: 5 }
}
]
)
Résultat :
{ "_id" :6, "name" :"Hop", "type" :"Kangourou", "weight" :130 }{ "_id" :5, "name" :"Bruce", "type" :"Chauve-souris", "poids" :3 }{ "_id" :8, "name" :"Snap", "type" :"Crocodile", "weight" :400 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }Le
$sample
L'étape fonctionne de deux manières, en fonction du nombre de documents dans la collection, de la taille de l'échantillon par rapport au nombre de documents dans la collection et de sa position dans le pipeline. Voir MongoDB$sample
pour une explication de son fonctionnement.Il est également possible que le
$sample
stage pourrait renvoyer le même document plus d'une fois dans son jeu de résultats.Le
$rand
OpérateurLe
$rand
L'opérateur a été introduit dans MongoDB 4.4.2, et son but est de renvoyer un flottant aléatoire entre 0 et 1 à chaque fois qu'il est appelé.Par conséquent, nous pouvons l'utiliser dans le
$match
étape en conjonction avec d'autres opérateurs, tels que$expr
et$lt
pour renvoyer un échantillon aléatoire de documents.Exemple :
db.pets.aggregate( [ { $match: { $expr: { $lt: [ 0.5, { $rand: {} } ] } } } ] )
Résultat :
{ "_id" :3, "name" :"Meow", "type" :"Chat", "weight" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Chat", "poids" :8 }{ "_id" :6, "nom" :"Hop", "type" :"Kangourou", "poids" :130 }{ "_id" :9, "nom" :"Flutter", "type" :"Hummingbird", "weight" :1 }Le jeu de résultats de cette approche est différent du
$sample
approche, en ce sens qu'elle ne renvoie pas un nombre fixe de documents. Le nombre de documents renvoyés avec cette approche peut varier.Par exemple, voici ce qui se passe lorsque j'exécute plusieurs fois le même code.
Ensemble de résultats 2 :
{ "_id" :1, "name" :"Wag", "type" :"Chien", "weight" :20 }{ "_id" :7, "name" :"Punch", "type" :"Gorille", "poids" :300 }{ "_id" :8, "nom" :"Snap", "type" :"Crocodile", "poids" :400 }Ensemble de résultats 3 :
{ "_id" :2, "name" :"Bark", "type" :"Chien", "weight" :10 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 }Ensemble de résultats 4 :
{ "_id" :1, "name" :"Wag", "type" :"Chien", "weight" :20 }{ "_id" :3, "name" :"Meow", "type" :"Chat", "poids" :7 }{ "_id" :6, "nom" :"Hop", "type" :"Kangourou", "poids" :130 }{ "_id" :8, "nom" :"Snap", "type" :"Crocodile", "poids" :400 }Ensemble de résultats 5 :
{ "_id" :1, "name" :"Wag", "type" :"Chien", "weight" :20 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :8, "name" :"Snap", "type" :"Crocodile", "weight" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 }Le
$sampleRate
OpérateurIntroduit dans MongoDB 4.4.2, le
$sampleRate
L'opérateur fournit un moyen plus concis de faire la même chose que l'exemple précédent.Lorsque vous utilisez
$sampleRate
, vous fournissez un taux d'échantillonnage sous la forme d'un nombre à virgule flottante entre0
et1
. Le processus de sélection utilise une distribution aléatoire uniforme, et le taux d'échantillonnage que vous fournissez représente la probabilité qu'un document donné soit sélectionné lors de son passage dans le pipeline.Exemple :
db.pets.aggregate( [ { $match: { $sampleRate: 0.5 } } ] )
Résultat :
{ "_id" :1, "name" :"Wag", "type" :"Chien", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Chien", "poids" :10 }{ "_id" :5, "nom" :"Bruce", "type" :"Chauve-souris", "poids" :3 }{ "_id" :6, "nom" :"Hop", "type" :"Kangaroo", "weight" :130 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ " _id" :8, "name" :"Snap", "type" :"Crocodile", "weight" :400 }Et exécutez-le à nouveau :
{ "_id" :3, "name" :"Meow", "type" :"Chat", "weight" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :8, "name" :"Snap", "type" :"Crocodile", "weight" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 }Et encore :
{ "_id" :1, "name" :"Wag", "type" :"Chien", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Chien", "poids" :10 }{ "_id" :3, "nom" :"Miaou", "type" :"Chat", "poids" :7 }{ "_id" :8, "nom" :"Snap", "type" :"Crocodile", "poids" :400 }