在我的数据库中,我有数百万个文档。他们每个人都有一个时间戳。有些具有相同的时间戳。我想得到一些点(几百或可能更多)来绘制图表。我不想要所有的分数。我希望每 n 点我选择 1 点。我知道有聚合框架,我试过了。问题在于我的数据量很大。当我进行聚合工作时,结果很容易超过文档最大大小 16MB。在 mongodb 中还有一个名为 skip 的函数,但它只跳过前 n 个文档。有什么好方法可以实现我想要的吗?或者有没有办法让聚合结果更大?提前致谢!
问问题
182 次
1 回答
1
我不确定如何使用 A/F 或 M/R 来做到这一点 - 只是跳过(fe)每 10 个点不是 M/R 允许你做的事情——除非你根据选择每个点一个 10% 变化的随机值......这可能不是你想要的。但这确实有效:
db.so.output.drop();
db.so.find().count();
map = function() {
// rand does 0-1, so < 0.1 means 10%
if (Math.random() < 0.1) {
emit(this._id, this);
}
}
reduce = function(key, values) {
return values;
}
db.so.mapReduce( map, reduce, { out: 'output' } );
db.output.find();
输出一些东西:
{
"result" : "output",
"timeMillis" : 4,
"counts" : {
"input" : 23,
"emit" : 3,
"reduce" : 0,
"output" : 3
},
"ok" : 1,
}
> db.output.find();
{ "_id" : ObjectId("51ffc4bc16473d7b84172d85"), "value" : { "_id" : ObjectId("51ffc4bc16473d7b84172d85"), "date" : ISODate("2013-08-05T15:24:45Z") } }
{ "_id" : ObjectId("51ffc75316473d7b84172d8e"), "value" : { "_id" : ObjectId("51ffc75316473d7b84172d8e") } }
{ "_id" : ObjectId("51ffc75316473d7b84172d8f"), "value" : { "_id" : ObjectId("51ffc75316473d7b84172d8f") } }
或者:
> db.so.mapReduce( map, reduce, { out: 'output' } );
{
"result" : "output",
"timeMillis" : 19,
"counts" : {
"input" : 23,
"emit" : 2,
"reduce" : 0,
"output" : 2
},
"ok" : 1,
}
> db.output.find();
{ "_id" : ObjectId("51ffc4bc16473d7b84172d83"), "value" : { "_id" : ObjectId("51ffc4bc16473d7b84172d83"), "date" : ISODate("2013-08-05T15:24:25Z") } }
{ "_id" : ObjectId("51ffc4bc16473d7b84172d86"), "value" : { "_id" : ObjectId("51ffc4bc16473d7b84172d86"), "date" : ISODate("2013-08-05T15:25:15Z") } }
取决于随机因素。
于 2013-08-05T15:36:04.980 回答