您好,匿名用户
随意问技术百科期待您的加入

MongoDB如何随机获取若干条记录

0 投票

在MySQL中,可以通过下面的语句简单的获取随机的5条记录:

SELECT * FROM `table` ORDER BY RAND() LIMIT 5

但是在MongoDB下,没有找到rand()方法,而且ObjectID也不是MySQL那样整数的,不好随机,不知道大家有什么好办法?

用户头像 提问 2012年 12月1日 @ Lucia 上等兵 (416 威望)
分享到:

1个回答

0 投票
 
最佳答案

实际上有在讨论是不是要增加这个特性:https://jira.mongodb.org/browse/SERVE...,目前看来没有实质进展。

其实MySQL里也只是创建一个临时表,为所有的备选行生成一个随机数,然后针对这个随机数进行排序获得你需要的结果。

在MongoDB里,你得自行为doc构建这样的排序属性,这个属性的值可以是一个随机数,从cookbook里摘过来的:

db.docs.save( { key : 1, ..., random : Math.random() } )

查找的时候,也算个随机数出来,然后去排序属性里找最接近它的,不过记得给排序属性加索引:

rand = Math.random()
cmp  = Math.random()
result = db.docs.findOne( { key : 2, random : { $gte : rand } } )
if ( result == null ) {
    result = db.docs.findOne( { key : 2, random : { $lte : rand } } )
}

因为排序属性的值不像MySQL里是动态的,所以如果要真正随机地获取多个doc,还就得循环上面的操作。

我想这个问题的根本还是,是否需要数学意义上的随机,如果只是要个大概,对于大数据量,不加索引的时候,可以用Map/Reduce提高收敛速度。

所以呢,其实用时间戳也行,任何能找出来上下限值,同时别太多重复值的属性都可以用来做随机排序。

用户头像 回复 2012年 12月1日 @ Lee Sin 上等兵 (347 威望)
选中 2012年 12月1日 @Lucia
提一个问题:

相关问题

0 投票
1 回复 42 阅读
用户头像 提问 2012年 12月1日 @ Caitlyn 上等兵 (452 威望)
0 投票
1 回复 47 阅读
用户头像 提问 2012年 12月1日 @ Apple 上等兵 (542 威望)
0 投票
1 回复 52 阅读
用户头像 提问 2012年 12月1日 @ Talon 上等兵 (294 威望)
0 投票
1 回复 41 阅读
用户头像 提问 2012年 12月1日 @ Lux 上等兵 (267 威望)
0 投票
1 回复 45 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...