var total = db.collname.count();
var count = 0;
var numSamples = 1000;
for (i = 0; i < numSamples; i++) {
var random = Math.floor(Math.random()*total);
var doc = db.collname.find().skip(random).limit(1).next();
if (doc.thefield) {
count += (doc.thefield == 1);
}
}
5 回答
这是
mongo
shell中的一个示例..假设collname
的集合,以及thefield
中感兴趣的值:对于MongoDB 3.0以及之前的版本,我使用了SQL时代的旧技巧(我认为维基百科使用它的随机页面功能) . 我在随机化的每个对象中存储0到1之间的随机数,让我们称之为“r” . 然后在“r”上添加索引 .
现在要获得随机x对象,您可以使用:
这为您提供了单个查找查询中的随机对象 . 根据您的需要,这可能有点过分,但如果您要随着时间的推移进行大量采样,这是一种非常有效的方法,而不会给您的后端带来负担 .
对于得到答案的人来说,你现在应该使用新的
$sample
聚合函数,3.2中的新函数 .https://docs.mongodb.org/manual/reference/operator/aggregation/sample/
然后使用
$group
添加另一个步骤来计算0
和1
以获取计数 . Here is an example from the MongoDB docs .我打算用@Stennies回复编辑我的评论但你也可以在这里使用一个单独的自动递增ID索引作为替代,如果你要跳过大量的记录(在这里说话很大) .
我写了另一个问题的另一个答案很像这个问题,其中有人试图找到该集合的第n条记录:
php mongodb find nth entry in collection
我的答案的后半部分基本上描述了一种可以解决这个问题的潜在方法 . 你仍然需要循环1000次以获得随机行 .
如果您使用的是mongoengine,则可以使用SequenceField生成增量计数器 .
然后,要获取100的随机列表,请执行以下操作
你打电话的地方