Docs 菜单
Docs 主页
/
MongoDB Manual
/ / / /

$rand

在此页面上

  • 定义
  • 语法
  • 示例
  • 了解详情
$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 }

$rand (aggregation)

后退

$natural