sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB $rand

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

Vi 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.


  1. MongoDB-sammenlægninger ved hjælp af Java

  2. Forstå MongoDB Backup Options

  3. Fjederdata Match og Filter Nested Array

  4. Mongodb, sharding og flere Windows-tjenester