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

MongoDB $ échantillon

Dans MongoDB, le $sample l'étape de pipeline d'agrégation sélectionne au hasard le nombre spécifié de documents à partir de son entrée.

Exemple

Supposons que nous ayons une collection appelée employees avec les documents suivants :

{ "_id" : 1, "name" : "Bob", "salary" : 55000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 4, "name" : "Christopher", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }
{ "_id" : 6, "name" : "Homer", "salary" : 1 }
{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
{ "_id" : 8, "name" : "Zoro", "salary" : 300000 }
{ "_id" : 9, "name" : "Xena", "salary" : 382000 }

Nous pouvons utiliser le $sample étape pour sélectionner au hasard un nombre spécifié de documents de cette collection.

Exemple :

db.employees.aggregate(
   [
      { 
        $sample: { size: 3 } 
      }
   ]
)

Résultat :

{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }

Dans ce cas, j'ai précisé que la taille de l'échantillon est de 3. Nous pouvons voir que trois documents ont été retournés dans un ordre aléatoire.

Voici le résultat si j'exécute à nouveau le même code :

{ "_id" : 1, "name" : "Bob", "salary" : 55000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 9, "name" : "Xena", "salary" : 382000 }

Nous obtenons une sélection différente de documents.

Nous pouvons augmenter la taille de l'échantillon en augmentant le nombre.

Exemple :

db.employees.aggregate(
   [
      { 
        $sample: { size: 5 } 
      }
   ]
)

Résultat :

{ "_id" : 9, "name" : "Xena", "salary" : 382000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 4, "name" : "Christopher", "salary" : 45000 }
{ "_id" : 8, "name" : "Zoro", "salary" : 300000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Renvoyer tous les documents au hasard

Si la taille de l'échantillon demandé correspond ou est supérieure au nombre de documents de la collection, tous les documents sont renvoyés dans un ordre aléatoire.

Exemple :

db.employees.aggregate(
   [
      { 
        $sample: { size: 100 } 
      }
   ]
)

Résultat :

{ "_id" : 4, "name" : "Christopher", "salary" : 45000 }
{ "_id" : 8, "name" : "Zoro", "salary" : 300000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 6, "name" : "Homer", "salary" : 1 }
{ "_id" : 9, "name" : "Xena", "salary" : 382000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
{ "_id" : 1, "name" : "Bob", "salary" : 55000 }

Comment $sample Calcule le résultat

Le $sample utilise l'une des deux méthodes pour produire le résultat. La méthode réelle utilisée dépend du scénario.

Le tableau suivant décrit la méthode utilisée pour chaque scénario.

Scénario Méthode utilisée pour produire les résultats
Toutes les conditions suivantes sont remplies :
$sample est la première étape du pipeline
– La taille de l'échantillon spécifié est inférieure à 5 % du total des documents de la collection
– La collection contient plus de 100 documents
$sample utilise un curseur pseudo-aléatoire pour sélectionner les documents.
Toutes les conditions ci-dessus ne sont pas rencontré. $sample effectue une analyse de collecte suivie d'un tri aléatoire pour sélectionner le nombre spécifié de documents.

Doublons

La documentation MongoDB avertit que $sample peut afficher le même document plus d'une fois dans son jeu de résultats.