【问题标题】:mongodb fetch hundreds of data out of millions of datamongodb 从百万数据中取出数百条数据
【发布时间】:2013-08-05 15:05:57
【问题描述】:

在我的数据库中,我有数百万个文档。他们每个人都有一个时间戳。有些具有相同的时间戳。我想得到一些点(几百或可能更多)来绘制图表。我不想要所有的分数。我希望每 n 点我选择 1 点。我知道有聚合框架,我试过了。问题在于我的数据量很大。当我进行聚合工作时,结果很容易超过文档最大大小 16MB。在 mongodb 中还有一个名为 skip 的函数,但它只跳过前 n 个文档。有什么好方法可以实现我想要的吗?或者有没有办法让聚合结果更大?提前致谢!

【问题讨论】:

  • 我很久没用过mongo了,但是你不能运行一个map reduce并将输出汇集到一个或多个临时集合吗?
  • 感谢您的回复。我认为 mapreduce 会太慢,虽然它和聚合组有相同的效果。
  • 要克服 16MB 的限制,M/R 是一种方法。如果它太慢或不会太慢,唯一的检查方法就是测量它。如果您的收藏变得非常大,请考虑sharding。在这种情况下,M/R 作业将自动并行分派到每个分片。
  • 不,您不能在当前版本的 MongoDB 中使聚合结果文档变大。

标签: mongodb


【解决方案1】:

我不确定如何使用 A/F 或 M/R 来做到这一点 - 只是跳过(例如)每 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") } }

取决于随机因素。

【讨论】:

  • 这似乎不是挑选“n”个点的好解决方案(因为它实际上是随机结果)。
  • 但这是一个有趣的想法。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-10-30
  • 2011-11-29
  • 2017-02-13
  • 1970-01-01
  • 2012-10-12
  • 2012-02-21
  • 1970-01-01
  • 2020-03-07
相关资源
最近更新 更多