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.