Mongodb中随机的查询文档记录

WBOY
發布: 2016-06-07 16:34:38
原創
1080 人瀏覽過

在实际应用场景中,几乎都会有随机获取数据记录的需求。而这个需求在 Mongodb 却不是很好实现,就目前而言,大致上有三种解决方案: 先计算出一个从 0 到记录总数之间的随机数,然后采用 skip(yourRandomNumber) 方法。 为每一条记录增设 random 字段,插入

在实际应用场景中,几乎都会有随机获取数据记录的需求。而这个需求在 Mongodb 却不是很好实现,就目前而言,大致上有三种解决方案:

  1. 先计算出一个从0到记录总数之间的随机数,然后采用skip(yourRandomNumber)方法。
  2. 为每一条记录增设random字段,插入数据时赋值为Math.random(),查询时采用$gte$lte
  3. 借助 Mongodb 对地理空间索引(geospatial indexes)的支持,从而可以在第二种方法的基础上来实现随机记录的获取。

因为 Mongodb 是不建议使用skip方法的,所以这里就略去第一种方法吧。

方法二

> db.twitter.save({ username: 'heroic', random: Math.random(), content: 'balabala0...' })
> db.twitter.save({ username: 'heroic', random: Math.random(), content: 'balabala1...' })
> db.twitter.save({ username: 'heroic', random: Math.random(), content: 'balabala2...' })
> db.twitter.save({ username: 'heroic', random: Math.random(), content: 'balabala3...' })
> db.twitter.save({ username: 'heroic', random: Math.random(), content: 'balabala4...' })
/* more records... */
/* create index */
> db.twitter.ensureIndex({ username: 1, random: 1 })
> rand = Math.random()
> result = db.twitter.findOne({ username: 'heroic', random: { $gte: rand } })
> if (result == null) {
>   result = db.twitter.findOne({ username: 'heroic', random: { $lte: rand } })
> }
登入後複製

方法三

> db.twitter.save({ username: 'heroic', random: [Math.random(), 0], content: 'balabala0...' })
> db.twitter.save({ username: 'heroic', random: [Math.random(), 0], content: 'balabala1...' })
> db.twitter.save({ username: 'heroic', random: [Math.random(), 0], content: 'balabala2...' })
> db.twitter.save({ username: 'heroic', random: [Math.random(), 0], content: 'balabala3...' })
> db.twitter.save({ username: 'heroic', random: [Math.random(), 0], content: 'balabala4...' })
/* more records... */
/* create index */
> db.twitter.ensureIndex({ username: 1, random: '2d' })
> result = db.twitter.findOne({ username: 'heroic', random: { $near: [Math.random(), 0] } })
登入後複製

更多关于 Mongodb 地理空间索引资料,请参见这里。

目前这几种方案似乎都不是很理想,但是也没有其他办法了,所以广大程序员们就相约到 Mongodb 的官方 jira 提了相应的需求,但是目前仍然没有任何的响应。可以参见这里,围观一下。

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板