sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB $rand

V MongoDB, $rand Operátor agregačního potrubí vrací náhodný float mezi 0 a 1.

Hodnota s plovoucí desetinnou čárkou má až 17 číslic za desetinnou čárkou. Všechny koncové nuly jsou vynechány, takže počet číslic se může lišit.

$rand operátor byl představen v MongoDB 4.4.2.

Příklad

Předpokládejme, že máme sbírku nazvanou cats s následujícími dokumenty:

{ "_id" :1, "name" :"Scratch" }{ "_id" :2, "name" :"Mňau" }{ "_id" :3, "name" :"Fluffy" } 

Můžeme použít $rand operátor pro generování náhodného čísla pro každou kočku:

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

Výsledek:

{ "_id" :1, "randomNumber" :0,5593964875463812 }{ "_id" :2, "randomNumber" :0,04357301703691149 }{ "_id" :3, 7, 7727:8515,91149 náhodně> 

$rand operátor nepřijímá žádné argumenty – jednoduše jej zavoláte pomocí $rand: {} .

Také $rand generuje nové číslo při každém volání. Proto spuštěním výše uvedeného kódu vícekrát vznikne pro každou kočku jiné náhodné číslo.

Abych to ukázal, spustím to znovu a zde je nový výsledek:

{ "_id" :1, "randomNumber" :0,19672627212049873 }{ "_id" :2, "randomNumber" :0,05513133909795318 }{ "_id" :umber 3, 1967 97,08 92:02> náhodné číslo 

Můžeme vidět, že náhodná čísla se liší od těch vygenerovaných v předchozím příkladu.

Náhodná čísla větší než 1

Jak již bylo zmíněno, $rand vrací náhodný float mezi 0 a 1. To je v pořádku, pokud nám nevadí dostat nulu, po níž následuje až 17 náhodných desetinných míst.

Ale co když chceme náhodné číslo větší než 1?

V takových případech můžeme použít $multiply operátor pro vynásobení výsledku $rand .

Příklad:

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

Výsledek:

{ "_id" :1, "randomNumber" :1,958938543288535 }{ "_id" :2, "randomNumber" :4,437057321655847 }{ "_id" :3, "randomNumber:3892931" } 

Náhodné celé číslo

Můžeme také chtít odstranit zlomkovou část. V tomto případě můžeme použít operátor jako $floor k odstranění desetinné části, takže zůstane celé číslo.

Příklad:

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

Výsledek:

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

Tady je to znovu, ale tentokrát to vynásobíme 100:

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

Výsledek:

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

Uložte výsledky

Jak již bylo zmíněno, $rand vygeneruje nový náhodný float pokaždé, když je zavolán. To je v pořádku, pokud chceme při každém spuštění kódu nové náhodné číslo, ale co když chceme náhodné číslo uložit do každého dokumentu?

K uložení náhodného čísla v dokumentu můžeme použít $addFields operátor (nebo jeho alias $set ), chcete-li do dokumentu přidat nové pole.

Příklad:

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

V tomto příkladu rozdělíme operaci na dvě $set fáze a $merge etapa.

$merge stage zapisuje výsledky agregačního kanálu do určené kolekce a musí to být poslední fáze v kanálu.

Nyní, když vrátíme dokumenty z této kolekce (např. pomocí metody jako find() ), vidíme, že každý dokument obsahuje nové pole s náhodným číslem:

db.cats.find() 

Výsledek:

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

Nyní je náhodné číslo trvalé. Dokumenty můžeme vrátit, kolikrát chceme, a náhodné číslo zůstane stejné.

Spusťte find() znovu:

db.cats.find() 

Výsledek:

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

Úplně stejné náhodné číslo.


  1. Dokumentace ClusterControl 1.5 – co je nového

  2. Nastavte Mongo Timeout v Spring Boot

  3. Upozornění na vypršení platnosti klíče Redis s Jedisem

  4. 4 způsoby aktualizace dokumentu v MongoDB