文档菜单
文档首页
/
MongoDB 手册
/ / /

$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字段。使用$rand生成介于0和1之间的初始值。然后使用$multiply将其向上扩展100倍。

第二个$floor操作符从第二个$set阶段中删除了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 将为真。

$project 阶段,选中的文档被过滤以返回 nameregistered 字段。第三区有 7 名选民,运行代码选择其中大约一半。

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

注意

每次选择的文档数量可能不同。如果您需要选择确切的文档数,请考虑使用 $sample 而不是 $rand

提示

另请参阅

返回

将弧度转换为度

在本页面上