mongodb从数百万个数据中获取数百个数据

时间:2013-08-05 15:05:57

标签: mongodb

在我的数据库中,我有数百万个文档。他们每个人都有一个时间戳。有些人有相同的时间戳。我想得到一些点(几百或可能更像数千)来绘制图形。我不想要所有的观点。我想要每1分我选1分。我知道有聚合框架,我尝试过。问题是因为我的数据很庞大。当我进行聚合工作时,结果超出文档最大大小,16MB,很容易。在mongodb中还有一个名为skip的函数,但它只跳过前n个文档。有没有很好的方法来实现我想要的?或者有没有办法使聚合结果更大?提前谢谢!

1 个答案:

答案 0 :(得分: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") } }

取决于随机因素。