Mongodb Aggregation Map减少

时间:2014-04-16 10:58:11

标签: mongodb mapreduce aggregation-framework

几个星期前我已经开始探索mongodb了。我有一个场景。我有一个有300万条记录的藏品。

我想基于两个键对聚合进行聚合(也需要使用匹配条件)。我使用了聚合框架。我开始知道,如果处理文档大小(数组)超过16 MB,聚合将失败。

我尝试时遇到了同样的问题。我正在尝试使用map reduce。我需要有关实施相同的指导。如何通过使用map reduce来克服16 MB的大小限制?

此外,我开始知道我可以通过将集合拆分为多个集合并在同一集合上进行聚合来实现。如果有人能指出我正确的方向会很棒吗?

1 个答案:

答案 0 :(得分:2)

即使没有代码,您的问题也有基本答案。

BSON document 16MB输出大小的限制是针对“内联”响应。这意味着您的操作的响应不会从您对集合的响应中写出单个“文档”。

所以用mapReduce语句就像这样:

db.collection.mapReduce(
    mapper,
    reducer,
    { "out": { "inline": 1 } }
)

问题是响应中的“数组”需要低于16MB。但是,如果您将其更改为输出到集合:

db.collection.mapReduce(
    mapper,
    reducer,
    { "out": { "replace": "newcollection" } }
)

然后你不再有这个限制。

同样适用于版本2.6及更高版本的aggregate方法,使用$out管道阶段:

db.collection.aggregate([
   // lots of pipeline

   { "$out": "newcollection }

])

通过输出到集合,以同样的方式克服了限制。

实际上使用聚合语句,再次从版本2.6及更高版本返回cursor,就像.find()方法一样,并且也不受此限制。