MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB $rand

Di MongoDB, $rand operator pipa agregasi mengembalikan float acak antara 0 dan 1.

Nilai floating point memiliki hingga 17 digit setelah titik desimal. Setiap angka nol yang tertinggal dihilangkan, sehingga jumlah digitnya dapat bervariasi.

$rand operator diperkenalkan di MongoDB 4.4.2.

Contoh

Misalkan kita memiliki koleksi yang disebut cats dengan dokumen sebagai berikut:

{ "_id" :1, "name" :"Scratch" }{ "_id" :2, "name" :"Meow" }{ "_id" :3, "name" :"Fluffy" } 

Kita dapat menggunakan $rand operator untuk menghasilkan nomor acak untuk setiap kucing:

db.cats.aggregate(
   [
     {
       $project:
          {
            randomNumber: { $rand: {} }
          }
     }
   ]
) 

Hasil:

{ "_id" :1, "randomNumber" :0.5593964875463812 }{ "_id" :2, "randomNumber" :0.04357301703691149 }{ "_id" :3, "randomNumber" :0.7556877215199272 }

$rand operator tidak menerima argumen apa pun – Anda cukup memanggilnya dengan menggunakan $rand: {} .

Juga, $rand menghasilkan nomor baru setiap kali dipanggil. Oleh karena itu, menjalankan kode di atas beberapa kali akan menghasilkan nomor acak yang berbeda untuk setiap kucing.

Untuk mendemonstrasikan ini, saya akan menjalankannya lagi dan inilah hasil barunya:

{ "_id" :1, "randomNumber" :0.19672627212049873 }{ "_id" :2, "randomNumber" :0,05513133909795318 }{ "_id" :3, "randomNumber" :0.7509841462815067 }

Kita dapat melihat bahwa angka acak berbeda dengan yang dihasilkan pada contoh sebelumnya.

Bilangan Acak Lebih Besar dari 1

Seperti yang disebutkan, $rand mengembalikan float acak antara 0 dan 1. Ini bagus jika kita tidak keberatan mendapatkan nol, diikuti hingga 17 tempat desimal acak.

Tetapi bagaimana jika kita menginginkan angka acak lebih besar dari 1?

Dalam kasus seperti itu, kita dapat menggunakan $multiply operator untuk mengalikan hasil $rand .

Contoh:

db.cats.aggregate(
   [
     {
       $project:
          {
            randomNumber: { $multiply: [ { $rand: {} }, 10 ] }
          }
     }
   ]
) 

Hasil:

{ "_id" :1, "randomNumber" :1.958938543288535 }{ "_id" :2, "randomNumber" :4.437057321655847 }{ "_id" :3, "randomNumber" :8.238909118372334 }

Bilangan Bulat Acak

Kita mungkin juga ingin menghilangkan bagian pecahan. Dalam hal ini, kita dapat menggunakan operator seperti $floor untuk menghapus bagian desimal, sehingga meninggalkan bilangan bulat.

Contoh:

db.cats.aggregate(
   [
     {
       $project:
          {
            name: 1,
            randomNumber: { 
              $floor: { 
                $multiply: [ { $rand: {} }, 10 ] 
                } 
              }
          }
     }
   ]
) 

Hasil:

{ "_id" :1, "name" :"Scratch", "randomNumber" :0 }{ "_id" :2, "name" :"Meow", "randomNumber" :5 }{ "_id" :3, "name" :"Fluffy", "randomNumber" :7 }

Ini dia lagi, tapi kali ini kita kalikan dengan 100:

db.cats.aggregate(
   [
     {
       $project:
          {
            name: 1,
            randomNumber: { 
              $floor: { 
                $multiply: [ { $rand: {} }, 100 ] 
                } 
              }
          }
     }
   ]
) 

Hasil:

{ "_id" :1, "name" :"Scratch", "randomNumber" :18 }{ "_id" :2, "name" :"Meow", "randomNumber" :62 }{ "_id" :3, "name" :"Fluffy", "randomNumber" :92 }

Simpan Hasil

Seperti yang disebutkan, $rand menghasilkan float acak baru setiap kali dipanggil. Tidak masalah jika kita menginginkan nomor acak baru setiap kali kita menjalankan kode, tetapi bagaimana jika kita ingin menyimpan nomor acak di setiap dokumen?

Untuk menyimpan nomor acak dalam dokumen, kita dapat menggunakan $addFields operator (atau aliasnya $set ) untuk menambahkan bidang baru ke dokumen.

Contoh:

db.cats.aggregate(
   [
      { $set: { randomNumber: { $multiply: [ { $rand: {} }, 100 ] } } },
      { $set: { randomNumber: { $floor: "$randomNumber" } } },
      { $merge: "cats" }
   ]
) 

Dalam contoh ini, kami memisahkan operasi di dua $set tahapan dan $merge panggung.

$merge stage menulis hasil dari pipeline agregasi ke koleksi yang ditentukan, dan itu harus menjadi tahapan terakhir dalam pipeline.

Sekarang ketika kita mengembalikan dokumen dari koleksi itu (misalnya dengan menggunakan metode seperti find() ), kita dapat melihat bahwa setiap dokumen berisi bidang baru dengan nomor acak:

db.cats.find() 

Hasil:

{ "_id" :1, "name" :"Scratch", "randomNumber" :61 }{ "_id" :2, "name" :"Meow", "randomNumber" :86 }{ "_id" :3, "name" :"Fluffy", "randomNumber" :73 }

Sekarang nomor acak tetap. Kami dapat mengembalikan dokumen sebanyak yang kami suka, dan nomor acak akan tetap sama.

Mari kita jalankan find() lagi:

db.cats.find() 

Hasil:

{ "_id" :1, "name" :"Scratch", "randomNumber" :61 }{ "_id" :2, "name" :"Meow", "randomNumber" :86 }{ "_id" :3, "name" :"Fluffy", "randomNumber" :73 }

Nomor acak yang sama persis.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cara terbaik untuk menyimpan tanggal/waktu di mongodb

  2. Pertempuran Database NoSQL - Membandingkan MongoDB &Cassandra

  3. MongoDB:Indeks unik pada properti elemen array

  4. Di mana posisi mongodb dalam teorema CAP?

  5. Bagaimana saya bisa membuat daftar semua koleksi di shell MongoDB?