I MongoDB, $rand
aggregeringspipeline-operatören returnerar en slumpmässig flytning mellan 0 och 1.
Flyttalsvärdet har upp till 17 siffror efter decimalkomma. Alla avslutande nollor tas bort, så antalet siffror kan variera.
$rand
operatören introducerades i MongoDB 4.4.2.
Exempel
Anta att vi har en samling som heter cats
med följande dokument:
{ "_id" :1, "name" :"Scratch" }{ "_id" :2, "name" :"Mjau" }{ "_id" :3, "name" :"Fluffigt" }Vi kan använda
$rand
operatör för att generera ett slumptal för varje katt:db.cats.aggregate( [ { $project:{ randomNumber:{ $rand:{} } } ])
Resultat:
{ "_id" :1, "randomNumber" :0,5593964875463812 }{ "_id" :2, "randomNumber" :0,04357301703691149 }{ "_id" :3, "5 slumpmässigtNumberNumberNumber 5, 5, 51>72.72" 5 192.
$rand
operatören accepterar inga argument – du kallar den helt enkelt genom att använda$rand:{}
.Även
$rand
genererar ett nytt nummer varje gång det anropas. Att köra ovanstående kod flera gånger kommer därför att producera olika slumptal för varje katt.Bara för att demonstrera detta kommer jag att köra det igen och här är det nya resultatet:
{ "_id" :1, "randomNumber" :0,19672627212049873 }{ "_id" :2, "randomNumber" :0,05513133909795318 }{ "_id" :3, "021Number" 5, 02Number" 71Number" 5, 02Number" 5, 7, 7, 81Vi kan se att slumptalen skiljer sig från de som genererades i föregående exempel.
Slumptal större än 1
Som nämnts,
$rand
returnerar ett slumpmässigt flyt mellan 0 och 1. Det här är bra om vi inte har något emot att få en nolla, följt av upp till 17 slumpmässiga decimaler.Men vad händer om vi vill ha ett slumptal större än 1?
I sådana fall kan vi använda
$multiply
operatorn för att multiplicera resultatet av$rand
.Exempel:
db.cats.aggregate( [ { $project:{ randomNumber:{ $multiply:[ { $rand:{} }, 10 ] } } ])
Resultat:
{ "_id" :1, "randomNumber" :1.958938543288535 }{ "_id" :2, "randomNumber" :4.437057321655847 }{ "_id" :3, "randomNumber 8.428" 9138 :09138 :0138Slumpmässigt heltal
Vi kanske också vill avskaffa bråkdelen. I det här fallet kan vi använda en operator som
$floor
för att ta bort decimaldelen och lämnar därför ett heltal.Exempel:
db.cats.aggregate( [ { $project:{ name:1, randomNumber:{ $floor:{ $multiply:[ { $rand:{} }, 10 ] } } } ])
Resultat:
{ "_id" :1, "name" :"Scratch", "randomNumber" :0 }{ "_id" :2, "name" :"Mjau", "randomNumber" :5 }{ "_id" :3, "name" :"Fluffigt", "randomNumber" :7 }Här är den igen, men den här gången multiplicerar vi den med 100:
db.cats.aggregate( [ { $project:{ name:1, randomNumber:{ $floor:{ $multiply:[ { $rand:{} }, 100 ] } } } ])
Resultat:
{ "_id" :1, "name" :"Scratch", "randomNumber" :18 }{ "_id" :2, "name" :"Mjau", "randomNumber" :62 }{ "_id" :3, "name" :"Fluffigt", "randomNumber" :92 }Spara resultaten
Som nämnts,
$rand
genererar en ny slumpmässig flytande varje gång den anropas. Det här är bra om vi vill ha ett nytt slumptal varje gång vi kör koden, men vad händer om vi vill lagra slumptalet i varje dokument?För att lagra slumptalet i dokumentet kan vi använda
$addFields
operator (eller dess alias$set
) för att lägga till det nya fältet i dokumentet.Exempel:
db.cats.aggregate( [ { $set:{ randomNumber:{ $multiply:[ { $rand:{} }, 100 ] } } }, { $set:{ randomNumber:{ $golv:"$randomNumber" } } }, { $merge:"cats" } ])
I det här exemplet separerar vi operationen över två
$set
steg och en$merge
skede.
$merge
stadium skriver resultaten av aggregeringspipelinen till en specificerad samling, och det måste vara det sista steget i pipelinen.Nu när vi returnerar dokumenten från den samlingen (t.ex. genom att använda en metod som
find()
), kan vi se att varje dokument innehåller det nya fältet med slumptalet:db.cats.find()
Resultat:
{ "_id" :1, "name" :"Scratch", "randomNumber" :61 }{ "_id" :2, "name" :"Mjau", "randomNumber" :86 }{ "_id" :3, "name" :"Fluffigt", "randomNumber" :73 }Nu är slumptalet bestående. Vi kan returnera dokumenten så många gånger vi vill, och slumptalet förblir detsamma.
Låt oss köra
find()
igen:db.cats.find()
Resultat:
{ "_id" :1, "name" :"Scratch", "randomNumber" :61 }{ "_id" :2, "name" :"Mjau", "randomNumber" :86 }{ "_id" :3, "name" :"Fluffigt", "randomNumber" :73 }Exakt samma slumptal.