MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB $rand

В 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" } 

Случайно цяло число

Може също да искаме да премахнем дробната част. В този случай можем да използваме оператор като $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 }

Точно същото произволно число.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как правилно да се справяме с миграциите на схемата на mongoose?

  2. Какво да знаете, когато започнете да работите с MongoDB в производството - десет съвета

  3. Не мога да създам работещ проект meteor.js върху скитническа кутия

  4. Как да премахнете поле от документ на MongoDB ($unset)

  5. Контролен списък за сигурност за производствени внедрявания на MongoDB