MongoDB聚合运算符:$rand

MongoDB聚合运算符:$rand

文章目录

$rand聚合运算符用于返回一个0~1之间的随机浮点数。

语法

js 复制代码
{ $rand: {} }

$rand运算符不需要任何参数。每次调用$rand都会返回一个小数点后最多17位数字的浮点数值。尾数0会被去掉,因此实际位数可能会有所不同。

举例

生成随机数据点

使用下面的脚本创建donors集合包含了慈善捐款的信息:

js 复制代码
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 }
   ]
)

下面的聚合用随机捐赠金额更新每个文档:

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

第一个$set阶段更新amount字段,使用$rand产生0和1之间的初始值,然后使用$multiply乘以100。

第二个$set阶段,使用$floor运算符去除amount的小数部分,只留下整数值。

最后,使用$merge将前一步骤生成的amount字段值更新到donors集合的每个文档。

可以使用一个$project阶段来查看结果:

js 复制代码
db.donors.aggregate(
   [
      { $project: {_id: 0, donorId: 1, amount: 1 } }
   ]
)

投影显示缩放后的值为0到99的随机值:

json 复制代码
{ "donorId" : 1000, "amount" : 27 }
{ "donorId" : 1001, "amount" : 10 }
{ "donorId" : 1002, "amount" : 88 }
{ "donorId" : 1003, "amount" : 73 }
{ "donorId" : 1004, "amount" : 5 }

从集合中随机选择条目

可以在聚合管道中使用$rand从集合中选择随机文档,使用下面的脚本创建voters集合:

js 复制代码
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区大约一半的选民进行投票,如下面的聚合:

js 复制代码
db.voters.aggregate(
   [
      { $match: { district: 3 } },
      { $match: { $expr: { $lt: [0.5, {$rand: {} } ] } } },
      { $project: { _id: 0, name: 1, registered: 1 } }
   ]
)

第一个$match阶段对所有文档进行筛选,挑选出第三区的选民。

第二个$match阶段在匹配表达式中使用$rand进一步完善选择。$rand对每个文档产生一个介于0到1的值,$lt小于0.5意味着$expr有一半的文档返回true

$project阶段,筛选后的文档输出nameregistered字段,有7个选民在第三区,大约占全部的一半。

json 复制代码
{ "name" : "Archibald", "registered" : true }
{ "name" : "Debarge", "registered" : false }
{ "name" : "Humphrey", "registered" : true }
相关推荐
LjQ20407 分钟前
网络爬虫一课一得
开发语言·数据库·python·网络爬虫
烙印60112 分钟前
MyBatis原理剖析(二)
java·数据库·mybatis
RestCloud13 分钟前
如何通过ETLCloud实现跨系统数据同步?
数据库·数据仓库·mysql·etl·数据处理·数据同步·集成平台
你是狒狒吗14 分钟前
TM中,return new TransactionManagerImpl(raf, fc);为什么返回是new了一个新的实例
java·开发语言·数据库
Channing Lewis1 小时前
sql server如何创建表导入excel的数据
数据库·oracle·excel
秃头摸鱼侠1 小时前
MySQL安装与配置
数据库·mysql·adb
UGOTNOSHOT1 小时前
每日八股文6.3
数据库·sql
行云流水行云流水2 小时前
数据库、数据仓库、数据中台、数据湖相关概念
数据库·数据仓库
John Song2 小时前
Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
数据库·redis·哈希算法
IvanCodes2 小时前
七、Sqoop Job:简化与自动化数据迁移任务及免密执行
大数据·数据库·hadoop·sqoop