MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

3 façons de renvoyer un échantillon aléatoire de documents d'une collection MongoDB

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érateur

Le $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érateur

Introduit 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 entre 0 et 1 . 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 }