sql >> Database >  >> NoSQL >> MongoDB

MongoDB $sampleRate

In MongoDB is de $sampleRate aggregatiepijplijnfase komt overeen met een willekeurige selectie van invoerdocumenten.

Het aantal geselecteerde documenten benadert de steekproeffrequentie uitgedrukt als een percentage van het totale aantal documenten.

De $sampleRate operator werd geïntroduceerd in MongoDB 4.4.2.

Wanneer u $sampleRate gebruikt , geeft u de samplefrequentie op als een getal met drijvende komma tussen 0 en 1 . Het selectieproces maakt gebruik van een uniforme willekeurige verdeling en de steekproeffrequentie die u opgeeft, geeft de kans weer dat een bepaald document wordt geselecteerd terwijl het door de pijplijn gaat.

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(
   [
      { 
        $match: { $sampleRate: 0.33 } 
      }
   ]
)

Resultaat:

{ "_id" : 1, "name" : "Bob", "salary" : 55000 }
{ "_id" : 6, "name" : "Homer", "salary" : 1 }
{ "_id" : 8, "name" : "Zoro", "salary" : 300000 }

Door een samplefrequentie van 0.33 op te geven , hebben we aangegeven dat ongeveer een derde van de documenten moet worden geretourneerd.

Het werkelijke resultaat kan echter behoorlijk variëren, afhankelijk van het aantal documenten in de collectie. Collecties met een kleiner aantal documenten zullen behoorlijk gevarieerde resultaten hebben, terwijl grotere collecties dichter bij de verwachte uniforme willekeurige verdeling zouden moeten liggen.

Om dit te demonstreren, is hier de resultatenset die ik krijg als ik dezelfde code opnieuw uitvoer:

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

En nogmaals:

{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
{ "_id" : 8, "name" : "Zoro", "salary" : 300000 }

En nogmaals:

{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 6, "name" : "Homer", "salary" : 1 }
{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }

Dit is een kleinere collectie, en dus variëren de resultaten behoorlijk.

Als u een exact aantal documenten wilt retourneren, gebruikt u de $sample in plaats daarvan het podium.


  1. Time-out voor Jedis configureren

  2. Gebruik meer dan één schema per verzameling op mongodb

  3. Mongoose Model.find is geen functie?

  4. Mongoose / MongoDB $addToSet-functionaliteit gebruiken op een reeks objecten