在MySQL中,可以通过下面的语句简单的获取随机的5条记录:
SELECT * FROM `table` ORDER BY RAND() LIMIT 5
但是在MongoDB下,没有找到rand()
方法,而且ObjectID
也不是MySQL那样整数的,不好随机,不知道大家有什么好办法?
在MySQL中,可以通过下面的语句简单的获取随机的5条记录:
SELECT * FROM `table` ORDER BY RAND() LIMIT 5
但是在MongoDB下,没有找到rand()
方法,而且ObjectID
也不是MySQL那样整数的,不好随机,不知道大家有什么好办法?
使用Aggregation函数吧!
# python代码如下:
def sample(count):
"""随机从collection中取出满足alive=1条件的10条数据,结果只显示proxy字段"""
return collection.aggregation([{'$match': {'alive': 1}},
{'$project': {'_id': 0, 'proxy': 1}},
{'$sample': {'size': 10}}
])
Reference:Pipeline Aggregation Stages
加上条件
"$where":function () { if(Math.random()>0.1){return true;}else{return false;}}
配合limit(1)
以10分之一的概率随机选择集合中一条记录
可能比较省事,但是应用比较局限。仅做参考~
1 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读
1 回答782 阅读✓ 已解决
1 回答1.3k 阅读
1 回答751 阅读
1 回答659 阅读
实际上有在讨论是不是要增加这个特性:https://jira.mongodb.org/browse/SERVE...,目前看来没有实质进展。
其实MySQL里也只是创建一个临时表,为所有的备选行生成一个随机数,然后针对这个随机数进行排序获得你需要的结果。
在MongoDB里,你得自行为doc构建这样的排序属性,这个属性的值可以是一个随机数,从cookbook里摘过来的:
查找的时候,也算个随机数出来,然后去排序属性里找最接近它的,不过记得给排序属性加索引:
因为排序属性的值不像MySQL里是动态的,所以如果要真正随机地获取多个doc,还就得循环上面的操作。
我想这个问题的根本还是,是否需要数学意义上的随机,如果只是要个大概,对于大数据量,不加索引的时候,可以用Map/Reduce提高收敛速度。
所以呢,其实用时间戳也行,任何能找出来上下限值,同时别太多重复值的属性都可以用来做随机排序。