In MongoDB, il $sample la fase della pipeline di aggregazione seleziona casualmente il numero specificato di documenti dal suo input.
Esempio
Supponiamo di avere una collezione chiamata employees con i seguenti documenti:
{ "_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 }
Possiamo usare il $sample fase per selezionare casualmente un numero specificato di documenti da quella raccolta.
Esempio:
db.employees.aggregate(
[
{
$sample: { size: 3 }
}
]
) Risultato:
{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 } In questo caso ho specificato che la dimensione del campione è 3. Possiamo vedere che tre documenti sono stati restituiti in ordine casuale.
Ecco il risultato se quando eseguo di nuovo lo stesso codice:
{ "_id" : 1, "name" : "Bob", "salary" : 55000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 9, "name" : "Xena", "salary" : 382000 } Otteniamo una diversa selezione di documenti.
Possiamo aumentare la dimensione del campione aumentando il numero.
Esempio:
db.employees.aggregate(
[
{
$sample: { size: 5 }
}
]
) Risultato:
{ "_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 } Restituisci a caso tutti i documenti
Se la dimensione del campione richiesta corrisponde o è maggiore del numero di documenti nella raccolta, tutti i documenti vengono restituiti in ordine casuale.
Esempio:
db.employees.aggregate(
[
{
$sample: { size: 100 }
}
]
) Risultato:
{ "_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 } Come $sample Calcola il risultato
Il $sample stage utilizza uno dei due metodi per produrre il risultato. Il metodo effettivo utilizzato dipende dallo scenario.
La tabella seguente illustra quale metodo viene utilizzato per ogni scenario.
| Scenario | Metodo utilizzato per produrre i risultati |
|---|---|
| Sono soddisfatte tutte le seguenti condizioni: – $sample è la prima fase della pipeline – La dimensione del campione specificata è inferiore al 5% del totale dei documenti nella raccolta – La collezione contiene più di 100 documenti | $sample utilizza un cursore pseudo-casuale per selezionare i documenti. |
| Tutte le condizioni di cui sopra non incontrato. | $sample esegue una scansione della raccolta seguita da un ordinamento casuale per selezionare il numero di documenti specificato. |
Duplicati
La documentazione di MongoDB avverte che $sample può produrre lo stesso documento più di una volta nel suo set di risultati.