BeWithYou

胡搞的技术博客

  1. 首页
  2. 运维/工具
  3. mongodb如何随机取出若干条文档

mongodb如何随机取出若干条文档


最近在重构德州机器人的服务,原本的机器人列表写在json文件中,每次进程读取文件后放在内存中。这样并不灵活,并且缺乏实时性。这次重构将其放入mongo中,每隔若干时间从服务端PHP全量拉取数据并更新mongo,比如更新机器人的金钱余额等。同时还可以根据程序内实际派遣情况,同步更新mongo中机器人的状态。

遇到一个问题,如何从若干条符合条件的document中选择几条?

mongo中的find方法和findOne方法取出来的文档实际上是按照特定顺序排列好的,所以不指定排序规则的话,每次取出来的数据都是按照相同的默认规则排序的。这就会导致排在前面的document被反复查找出来,相当于在羊的同一个地方薅羊毛。
这里必须令选取具有随机性。百度了下,有3种方法。但是有不太好,这里我选了第四种,官方的sample方法。不过得换成aggregate里使用。

  • 利用skip,limit来随机取记录
db.xxx.find().skip(m).limit(n);
//这里要注意m和n的取值,加起来不能超过总数量哦
  • 利用预先设置的rand字段
//插入字段的时候 预先设置一个random字段,random:Math.random()
rand = Math.random()
result = db.xxx.findOne({random: { $gte: rand }})
//判断一下保证能取到 这里以一条记录为例
if (result == null) {
result = db.xxx.findOne({random: { $lte: rand }})
  • 利用mongodb地理位置索引方法
db.xxx.ensureIndex({ username: 1, random: '2d' })
result = db.xxx.findOne({ random: { $near: [Math.random(), 0] }})
  • 利用aggregate的sample管道 随机取出来几条
//随机取3条数据出来
db.xxx.aggregate([$sample:{size:3}]);
回到顶部