В MongoDB, $rand
Операторът на конвейера за агрегиране връща произволно число с плаване между 0 и 1.
Стойността с плаваща запетая има до 17 цифри след десетичната запетая. Всички последващи нули се отстраняват, така че броят на цифрите може да варира.
$rand
операторът беше въведен в MongoDB 4.4.2.
Пример
Да предположим, че имаме колекция, наречена cats
със следните документи:
{ "_id" :1, "name" :"Scratch" }{ "_id" :2, "name" :"Meow" }{ "_id" :3, "name" :"Fluffy" }предварително>Можем да използваме
$rand
оператор за генериране на произволно число за всяка котка:db.cats.aggregate( [ { $project:{ randomNumber:{ $rand:{} } } ])
Резултат:
{ "_id" :1, "randomNumber" :0,5593964875463812 }{ "_id" :2, "randomNumber" :0,04357301703691149 }{ "_id" :3, "random":160 57 57 57 597 }$rand
операторът не приема никакви аргументи – просто го извиквате с помощта на$rand:{}
.Също така,
$rand
генерира ново число при всяко повикване. Следователно, изпълняването на горния код няколко пъти ще произведе различно произволно число за всяка котка.Само за да демонстрирам това, ще го стартирам отново и ето новия резултат:
{ "_id" :1, "randomNumber" :0.19672627212049873 }{ "_id" :2, "randomNumber" :0.05513133909795318 }{ "_id" :3, "случаен избор":160 8N umber 4, 60 8N umber.Можем да видим, че произволните числа са различни от тези, генерирани в предишния пример.
Случайни числа, по-големи от 1
Както споменахме,
$rand
връща произволна float между 0 и 1. Това е добре, ако нямаме нищо против да получим нула, последвана от до 17 произволни десетични знака.Но какво ще стане, ако искаме произволно число, по-голямо от 1?
В такива случаи можем да използваме
$multiply
оператор, за да умножите резултата от$rand
.Пример:
db.cats.aggregate( [ { $project:{ randomNumber:{ $multiply:[ { $rand:{} }, 10 ] } } ])
Резултат:
{ "_id" :1, "randomNumber" :1.958938543288535 }{ "_id" :2, "randomNumber" :4.437057321655847 }{ "_id" :3, "randomNumber.138" }094 8238>Случайно цяло число
Може също да искаме да премахнем дробната част. В този случай можем да използваме оператор като
$floor
за да премахнете десетичната част, като оставите цяло число.Пример:
db.cats.aggregate( [ { $project:{ name:1, randomNumber:{ $floor:{ $multiply:[ { $rand:{} }, 10 ] } } } ])код>
Резултат:
{ "_id" :1, "name" :"Scratch", "randomNumber" :0 }{ "_id" :2, "name" :"Meow", "randomNumber" :5 }{ "_id" :3, "name" :"Fluffy", "randomNumber" :7 }Ето го отново, но този път го умножаваме по 100:
db.cats.aggregate( [ { $project:{ name:1, randomNumber:{ $floor:{ $multiply:[ { $rand:{} }, 100 ] } } } ])код>
Резултат:
{ "_id" :1, "name" :"Scratch", "randomNumber" :18 }{ "_id" :2, "name" :"Meow", "randomNumber" :62 }{ "_id" :3, "name" :"Fluffy", "randomNumber" :92 }Запазване на резултатите
Както споменахме,
$rand
генерира нов произволен float всеки път, когато бъде извикан. Това е добре, ако искаме ново произволно число всеки път, когато стартираме кода, но какво ще стане, ако искаме да съхраняваме произволното число във всеки документ?За да съхраняваме произволното число в документа, можем да използваме
$addFields
оператор (или неговият псевдоним$set
), за да добавите новото поле към документа.Пример:
db.cats.aggregate( [ { $set:{ randomNumber:{ $multiply:[ { $rand:{} }, 100 ] } } }, { $set:{ randomNumber:{ $floor:"$randomNumber" } } }, { $merge:"котки" } ])
В този пример разделяме операцията между две
$set
етапи и$merge
сцена.
$merge
stage записва резултатите от конвейера за агрегиране в определена колекция и трябва да е последният етап в конвейера.Сега, когато върнем документите от тази колекция (например с помощта на метод като
find()
), можем да видим, че всеки документ съдържа новото поле със произволно число:db.cats.find()
Резултат:
{ "_id" :1, "name" :"Scratch", "randomNumber" :61 }{ "_id" :2, "name" :"Meow", "randomNumber" :86 }{ "_id" :3, "name" :"Fluffy", "randomNumber" :73 }Сега произволното число е постоянно. Можем да връщаме документите толкова пъти, колкото пожелаем, а произволното число ще остане същото.
Нека изпълним
find()
отново:db.cats.find()
Резултат:
{ "_id" :1, "name" :"Scratch", "randomNumber" :61 }{ "_id" :2, "name" :"Meow", "randomNumber" :86 }{ "_id" :3, "name" :"Fluffy", "randomNumber" :73 }Точно същото произволно число.