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.