I MongoDB er $rand
aggregeringspipeline-operatør returnerer en tilfældig float mellem 0 og 1.
Den flydende kommaværdi har op til 17 cifre efter decimalkommaet. Eventuelle efterfølgende nuller slettes, så antallet af cifre kan variere.
$rand
operatør blev introduceret i MongoDB 4.4.2.
Eksempel
Antag, at vi har en samling kaldet cats
med følgende dokumenter:
{ "_id" :1, "name" :"Scratch" }{ "_id" :2, "name" :"Meow" }{ "_id" :3, "name" :"Fluffy" }Vi kan bruge
$rand
operatør for at generere et tilfældigt tal for hver kat:db.cats.aggregate( [ { $project:{ randomNumber:{ $rand:{} } } ])
Resultat:
{ "_id" :1, "randomNumber" :0,5593964875463812 }{ "_id" :2, "randomNumber" :0,04357301703691149 }{ "_id" :3, "5 tilfældigNumberNumberNumber 5" 5,72>72>72.
$rand
operatøren accepterer ingen argumenter – du kalder den blot ved at bruge$rand:{}
.Også
$rand
genererer et nyt nummer, hver gang det bliver kaldt. Derfor vil kørsel af ovenstående kode flere gange producere et forskelligt tilfældigt tal for hver kat.Bare for at demonstrere dette, kører jeg det igen, og her er det nye resultat:
{ "_id" :1, "randomNumber" :0,19672627212049873 }{ "_id" :2, "randomNumber" :0,05513133909795318 }{ "_id" :3, "07.910 tilfældig" 61. 71.81Vi kan se, at de tilfældige tal er forskellige fra dem, der blev genereret i det foregående eksempel.
Tilfældige tal større end 1
Som nævnt,
$rand
returnerer en tilfældig float mellem 0 og 1. Dette er fint, hvis vi ikke har noget imod at få et nul, efterfulgt af op til 17 tilfældige decimaler.Men hvad hvis vi vil have et tilfældigt tal større end 1?
I sådanne tilfælde kan vi bruge
$multiply
operator for at gange resultatet af$rand
.Eksempel:
db.cats.aggregate( [ { $project:{ randomNumber:{ $multiply:[ { $rand:{} }, 10 ] } } ])
Resultat:
{ "_id" :1, "randomNumber" :1.958938543288535 }{ "_id" :2, "randomNumber" :4.437057321655847 }{ "_id" :3, "randomNumber" :0.338 :0.338 7.32>Tilfældigt heltal
Vi vil måske også gøre op med brøkdelen. I dette tilfælde kan vi bruge en operator såsom
$floor
for at fjerne decimaldelen og efterlade derfor et heltal.Eksempel:
db.cats.aggregate( [ { $project:{ navn:1, randomNumber:{ $gulv:{ $multiply:[ { $rand:{} }, 10 ] } } } ])
Resultat:
{ "_id" :1, "name" :"Scratch", "randomNumber" :0 }{ "_id" :2, "name" :"Meow", "randomNumber" :5 }{ "_id" :3, "name" :"Fluffy", "randomNumber" :7 }Her er det igen, men denne gang gange vi det med 100:
db.cats.aggregate( [ { $project:{ navn:1, randomNumber:{ $gulv:{ $multiply:[ { $rand:{} }, 100 ] } } } } ])
Resultat:
{ "_id" :1, "name" :"Scratch", "randomNumber" :18 }{ "_id" :2, "name" :"Meow", "randomNumber" :62 }{ "_id" :3, "name" :"Fluffy", "randomNumber" :92 }Gem resultaterne
Som nævnt,
$rand
genererer en ny tilfældig float hver gang den kaldes. Det er fint, hvis vi vil have et nyt tilfældigt tal, hver gang vi kører koden, men hvad hvis vi vil gemme det tilfældige tal i hvert dokument?For at gemme det tilfældige tal i dokumentet kan vi bruge
$addFields
operator (eller dens alias$set
) for at tilføje det nye felt til dokumentet.Eksempel:
db.cats.aggregate( [ { $set:{ randomNumber:{ $multiply:[ { $rand:{} }, 100 ] } } }, { $set:{ randomNumber:{ $gulv:"$randomNumber" } } }, { $merge:"cats" } ])
I dette eksempel adskiller vi operationen på tværs af to
$set
stadier og en$merge
scene.
$merge
fase skriver resultaterne af aggregeringspipelinen til en specificeret samling, og det skal være det sidste trin i pipelinen.Når vi nu returnerer dokumenterne fra den samling (f.eks. ved at bruge en metode som
find()
), kan vi se, at hvert dokument indeholder det nye felt med det tilfældige tal:db.cats.find()
Resultat:
{ "_id" :1, "name" :"Scratch", "randomNumber" :61 }{ "_id" :2, "name" :"Meow", "randomNumber" :86 }{ "_id" :3, "name" :"Fluffy", "randomNumber" :73 }Nu er det tilfældige tal vedvarende. Vi kan returnere dokumenterne så mange gange, vi vil, og det tilfældige tal forbliver det samme.
Lad os køre
find()
igen:db.cats.find()
Resultat:
{ "_id" :1, "name" :"Scratch", "randomNumber" :61 }{ "_id" :2, "name" :"Meow", "randomNumber" :86 }{ "_id" :3, "name" :"Fluffy", "randomNumber" :73 }Præcis det samme tilfældige tal.