sql >> Database >  >> NoSQL >> MongoDB

MongoDB $rand

In MongoDB is de $rand aggregatie pijplijn operator retourneert een willekeurige float tussen 0 en 1.

De drijvende-kommawaarde heeft maximaal 17 cijfers achter de komma. Naloopnullen vallen weg, dus het aantal cijfers kan variëren.

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

Voorbeeld

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

{ "_id" : 1, "name" : "Scratch" }
{ "_id" : 2, "name" : "Meow" }
{ "_id" : 3, "name" : "Fluffy" }

We kunnen de $rand . gebruiken operator om een ​​willekeurig getal voor elke kat te genereren:

db.cats.aggregate(
   [
     {
       $project:
          {
            randomNumber: { $rand: {} }
          }
     }
   ]
)

Resultaat:

{ "_id" : 1, "randomNumber" : 0.5593964875463812 }
{ "_id" : 2, "randomNumber" : 0.04357301703691149 }
{ "_id" : 3, "randomNumber" : 0.7556877215199272 }

De $rand operator accepteert geen argumenten - je roept het gewoon aan met $rand: {} .

Ook $rand genereert elke keer dat het wordt gebeld een nieuw nummer. Daarom zal het meerdere keren uitvoeren van de bovenstaande code voor elke kat een ander willekeurig getal opleveren.

Om dit te demonstreren, zal ik het opnieuw uitvoeren en hier is het nieuwe resultaat:

{ "_id" : 1, "randomNumber" : 0.19672627212049873 }
{ "_id" : 2, "randomNumber" : 0.05513133909795318 }
{ "_id" : 3, "randomNumber" : 0.7509841462815067 }

We kunnen zien dat de willekeurige getallen verschillen van de getallen die in het vorige voorbeeld zijn gegenereerd.

Willekeurige getallen groter dan 1

Zoals vermeld, $rand retourneert een willekeurige float tussen 0 en 1. Dit is prima als we het niet erg vinden om een ​​nul te krijgen, gevolgd door maximaal 17 willekeurige decimalen.

Maar wat als we een willekeurig getal groter dan 1 willen?

In dergelijke gevallen kunnen we de $multiply . gebruiken operator om het resultaat van $rand . te vermenigvuldigen .

Voorbeeld:

db.cats.aggregate(
   [
     {
       $project:
          {
            randomNumber: { $multiply: [ { $rand: {} }, 10 ] }
          }
     }
   ]
)

Resultaat:

{ "_id" : 1, "randomNumber" : 1.958938543288535 }
{ "_id" : 2, "randomNumber" : 4.437057321655847 }
{ "_id" : 3, "randomNumber" : 8.238909118372334 }

Willekeurig geheel getal

We willen misschien ook het fractionele deel afschaffen. In dit geval kunnen we een operator gebruiken zoals $floor om het decimale deel te verwijderen, zodat een geheel getal overblijft.

Voorbeeld:

db.cats.aggregate(
   [
     {
       $project:
          {
            name: 1,
            randomNumber: { 
              $floor: { 
                $multiply: [ { $rand: {} }, 10 ] 
                } 
              }
          }
     }
   ]
)

Resultaat:

{ "_id" : 1, "name" : "Scratch", "randomNumber" : 0 }
{ "_id" : 2, "name" : "Meow", "randomNumber" : 5 }
{ "_id" : 3, "name" : "Fluffy", "randomNumber" : 7 }

Hier is het weer, maar deze keer vermenigvuldigen we het met 100:

db.cats.aggregate(
   [
     {
       $project:
          {
            name: 1,
            randomNumber: { 
              $floor: { 
                $multiply: [ { $rand: {} }, 100 ] 
                } 
              }
          }
     }
   ]
)

Resultaat:

{ "_id" : 1, "name" : "Scratch", "randomNumber" : 18 }
{ "_id" : 2, "name" : "Meow", "randomNumber" : 62 }
{ "_id" : 3, "name" : "Fluffy", "randomNumber" : 92 }

Sla de resultaten op

Zoals vermeld, $rand genereert elke keer dat het wordt aangeroepen een nieuwe willekeurige float. Dit is prima als we elke keer dat we de code uitvoeren een nieuw willekeurig getal willen, maar wat als we het willekeurige getal in elk document willen opslaan?

Om het willekeurige getal in het document op te slaan, kunnen we de $addFields . gebruiken operator (of zijn alias $set ) om het nieuwe veld aan het document toe te voegen.

Voorbeeld:

db.cats.aggregate(
   [
      { $set: { randomNumber: { $multiply: [ { $rand: {} }, 100 ] } } },
      { $set: { randomNumber: { $floor: "$randomNumber" } } },
      { $merge: "cats" }
   ]
)

In dit voorbeeld scheiden we de bewerking over twee $set stages en een $merge fase.

De $merge stage schrijft de resultaten van de aggregatiepijplijn naar een opgegeven verzameling en dit moet de laatste fase in de pijplijn zijn.

Wanneer we nu de documenten uit die verzameling retourneren (bijvoorbeeld door een methode te gebruiken zoals find() ), kunnen we zien dat elk document het nieuwe veld met het willekeurige getal bevat:

db.cats.find()

Resultaat:

{ "_id" : 1, "name" : "Scratch", "randomNumber" : 61 }
{ "_id" : 2, "name" : "Meow", "randomNumber" : 86 }
{ "_id" : 3, "name" : "Fluffy", "randomNumber" : 73 }

Nu is het willekeurige getal persistent. We kunnen de documenten zo vaak retourneren als we willen, en het willekeurige nummer blijft hetzelfde.

Laten we find() . uitvoeren nogmaals:

db.cats.find()

Resultaat:

{ "_id" : 1, "name" : "Scratch", "randomNumber" : 61 }
{ "_id" : 2, "name" : "Meow", "randomNumber" : 86 }
{ "_id" : 3, "name" : "Fluffy", "randomNumber" : 73 }

Precies hetzelfde willekeurige nummer.


  1. MongoDB - Een verzameling maken

  2. Kunnen redis-sleutelruimtemeldingen naar de redis-stream worden gepusht in plaats van pub/sub-kanaal?

  3. MongoDB PHP UTF-8 problemen

  4. Node.js &Redis / hget synchroniseren