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)
这为您提供了单个查找查询中的随机对象.根据您的需要,这可能有点过分,但如果您要随着时间的推移进行大量采样,这是一种非常有效的方法,而不会给您的后端带来负担.
这是 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)
| 归档时间: |
|
| 查看次数: |
10657 次 |
| 最近记录: |