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é čísloMůž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.