sql >> Database >  >> NoSQL >> MongoDB

MongoDB $ voorbeeld

In MongoDB, de $sample aggregatiepijplijnfase selecteert willekeurig het gespecificeerde aantal documenten uit de invoer.

Voorbeeld

Stel dat we een verzameling hebben met de naam employees met de volgende documenten:

{ "_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 }

We kunnen de $sample . gebruiken stap om willekeurig een bepaald aantal documenten uit die verzameling te selecteren.

Voorbeeld:

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

Resultaat:

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

In dit geval heb ik aangegeven dat de steekproefomvang 3 is. We kunnen zien dat drie documenten in willekeurige volgorde zijn geretourneerd.

Dit is het resultaat als ik dezelfde code opnieuw uitvoer:

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

We krijgen een andere selectie van documenten.

We kunnen de steekproefomvang vergroten door het aantal te vergroten.

Voorbeeld:

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

Resultaat:

{ "_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 }

Alle documenten willekeurig retourneren

Als de gevraagde steekproefomvang overeenkomt of groter is dan het aantal documenten in de collectie, worden alle documenten in willekeurige volgorde geretourneerd.

Voorbeeld:

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

Resultaat:

{ "_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 }

Hoe $sample Berekent het resultaat

De $sample stage gebruikt een van de twee methoden om het resultaat te produceren. De daadwerkelijk gebruikte methode is afhankelijk van het scenario.

De volgende tabel geeft aan welke methode voor elk scenario wordt gebruikt.

Scenario Methode gebruikt om de resultaten te produceren
Aan alle volgende voorwaarden is voldaan:
$sample is de eerste fase van de pijplijn
– De opgegeven steekproefomvang is minder dan 5% van het totale aantal documenten in de collectie
– De collectie bevat meer dan 100 documenten
$sample gebruikt een pseudo-willekeurige cursor om documenten te selecteren.
Alle bovenstaande voorwaarden zijn niet ontmoet. $sample voert een collectiescan uit gevolgd door een willekeurige sortering om het gespecificeerde aantal documenten te selecteren.

Duplicaten

De MongoDB-documentatie waarschuwt dat $sample kan hetzelfde document meer dan eens uitvoeren in de resultatenset.


  1. Kan mongo arraygegevens opwaarderen?

  2. $addFields als er geen $match is gevonden

  3. Apache HBase I/O – HFile

  4. Hoe addToSet uit te voeren met de officiële Go-driver?