来自Mongo的随机抽样

Adi*_*ngh 8 database sampling mongodb

我有一个带文件的mongo集合.每个文档中都有一个字段为0或1.我需要从数据库中随机抽取1000条记录,并将具有该字段的文档数量计为1.我需要对此进行1000次抽样.我该怎么做 ?

dal*_*ler 13

对于那些得到答案的人,您现在应该使用$sample3.2中的新聚合函数.

https://docs.mongodb.org/manual/reference/operator/aggregation/sample/

db.collection_of_things.aggregate(
   [ { $sample: { size: 15 } } ]
)
Run Code Online (Sandbox Code Playgroud)

然后添加另一个步骤来计算0s和1s来$group计算.以下是MongoDB文档中的示例.


Nic*_*ell 11

对于MongoDB 3.0以及之前的版本,我使用了SQL时代的旧技巧(我认为维基百科使用它的随机页面功能).我在随机化的每个对象中存储0到1之间的随机数,让我们称之为"r".然后在"r"上添加索引.

db.coll.ensureIndex(r: 1);
Run Code Online (Sandbox Code Playgroud)

现在要获得随机x对象,您可以使用:

var startVal = Math.random();
db.coll.find({r: {$gt: startVal}}).sort({r: 1}).limit(x);
Run Code Online (Sandbox Code Playgroud)

这为您提供了单个查找查询中的随机对象.根据您的需要,这可能有点过分,但如果您要随着时间的推移进行大量采样,这是一种非常有效的方法,而不会给您的后端带来负担.


Ste*_*nie 4

这是 shell 中的一个示例mongo.. 假设 的集合collname,以及 的感兴趣值thefield

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);
    }
}
Run Code Online (Sandbox Code Playgroud)