“文档” 菜单
文档首页
/
MongoDB Manual
/ / /

$rand(聚合)

在此页面上

  • 定义
  • 行为
  • 举例
$rand

每次调用都会返回一个 0 和 1 之间的随机浮点数。

$rand 通过以下语法实现:

{ $rand: {} }

$rand操作符不接受任何参数。

每次调用 $rand 时,它将返回一个小数点后最多 17 位的浮点值。结尾的 0 将被删除,实际位数可能会有所不同。

此示例模拟了慈善捐赠。集合从捐赠者名单开始。

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 }
]
)

我们利用聚合管道更新每份文档的随机捐赠金额。

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

第一个 $set阶段会更新amount字段。介于0和1之间的初始值使用$rand生成。然后, $multiply将其向上扩展100倍。

第二个 $set 阶段的 $floor 操作符删除了 amount 中的小数部分,以留下整数值。

最后,$merge 会将之前步骤中创建的随机值写入 amount 字段,并针对 donors 集合中的每个文档进行更新。

可以使用投影阶段查看结果:

db.donors.aggregate(
[
{ $project: {_id: 0, donorId: 1, amount: 1 } }
]
)

投影显示的缩放数值此时为范围介于 0 到 99 之间的随机值。

{ "donorId" : 1000, "amount" : 27 }
{ "donorId" : 1001, "amount" : 10 }
{ "donorId" : 1002, "amount" : 88 }
{ "donorId" : 1003, "amount" : 73 }
{ "donorId" : 1004, "amount" : 5 }

可以在聚合管道中使用 $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.aggregate(
[
{ $match: { district: 3 } },
{ $match: { $expr: { $lt: [0.5, {$rand: {} } ] } } },
{ $project: { _id: 0, name: 1, registered: 1 } }
]
)

第一个管道阶段匹配选民来自第 3 选区的所有文档。

第二个 $match 阶段在匹配表达式中使用 $rand 来进一步完善该选择。对于每份文档,$rand生成一个 0 和 1 之间的值。小于 ($lt) 比较中的阈值 0.5 意味着大约一半文档的 $expr 为 true。

$project 阶段,对所选文档进行筛选以返回 nameregistered 字段。第 3 选区有 7 名选民,运行代码可选出其中的一半左右。

{ "name" : "Archibald", "registered" : true }
{ "name" : "Debarge", "registered" : false }
{ "name" : "Humphrey", "registered" : true }

注意

每次选择的文档数量都不同。如需选择准确的文档数量,请考虑使用 $sample 而非 $rand

提示

另请参阅:

← $radiansToDegrees(聚合)

在此页面上