$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 }