MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $campione

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.