$rand
定义
返回一个在区间 [0, 1) 内的伪随机浮点数。0 包含,1 不包含。
语法
$rand
的语法如下
{ $rand: {} }
示例
生成随机数据点
本节中的示例展示了慈善捐赠。以下集合包含捐赠者列表
db.donors.insertMany( [ { donorId: 1000, amount: 0, frequency: 1 }, { donorId: 1001, amount: 0, frequency: 2 }, { donorId: 1002, amount: 0, frequency: 1 }, { donorId: 1003, amount: 0, frequency: 2 }, { donorId: 1004, amount: 0, frequency: 1 } ] )
以下示例使用随机捐赠金额更新《donors
》集合中的每个文档
db.donors.updateMany( {}, [ { $set: { amount: { $floor: { $multiply: [ { $rand: {} }, 100 ] } } } } ] )
空的更新过滤器与集合中的每个文档匹配。
对于每个文档,我们使用$rand
生成介于0和1之间的值,然后使用$multiply
.
$floor
运算符删除小数部分,因此更新的amount
是一个整数值。
更新集合后,文档看起来像这样
{ "donorId" : 1000, "amount" : 2, "frequency" : 1 } { "donorId" : 1001, "amount" : 58, "frequency" : 2 } { "donorId" : 1002, "amount" : 27, "frequency" : 1 } { "donorId" : 1003, "amount" : 26, "frequency" : 2 } { "donorId" : 1004, "amount" : 42, "frequency" : 1 }
从集合中选择随机项
$rand
运算符可用于从集合中选择随机文档。假设有一个选民记录集合
db.voters.insertMany( [ { name: "Archibald", voterId: 4321, district: 3, registered: true }, { name: "Beckham", voterId: 4331, district: 3, registered: true }, { name: "Carolin", voterId: 5321, district: 4, registered: true }, { name: "Debarge", voterId: 4343, district: 3, registered: false }, { name: "Eckhard", voterId: 4161, district: 3, registered: false }, { name: "Faberge", voterId: 4300, district: 1, registered: true }, { name: "Grimwald", voterId: 4111, district: 3, registered: true }, { name: "Humphrey", voterId: 2021, district: 3, registered: true }, { name: "Idelfon", voterId: 1021, district: 4, registered: true }, { name: "Justo", voterId: 9891, district: 3, registered: false } ] )
以下查询检索了3区大约一半选民的随机选择
db.voters.find( { district: 3, $expr: { $lt: [0.5, {$rand: {} } ] } }, { _id: 0, name: 1, registered: 1 } )
在 district
字段上的初始匹配选择选民来自3区的文档。
操作符 $expr
使用 $rand
进一步细化 find
操作。对于每个文档,$rand
生成0到1之间的值。阈值为 0.5
意味着小于 ($lt)
的比较将为集合中大约一半的文档返回 true。
3区有7名选民,运行此代码将选择其中大约一半。
{ "name" : "Beckham", "registered" : true } { "name" : "Eckhard", "registered" : false } { "name" : "Grimwald", "registered" : true } { "name" : "Humphrey", "registered" : true }