sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $rand

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, 81 

Vi 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 :0138 

Slumpmä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.


  1. Redis skanna hoppar över nycklar

  2. Installerar Redis på Debian 9

  3. Mongoose att ta bort (dra) ett dokument inom en array, fungerar inte med ObjectID

  4. Ta bort en post från arrayen med MongoDB-Java-drivrutinen