3

我试图将要更新的集合作为范围变量传递 - 没有骰子。我试图db.getCollection从 finalize 正文中调用 - 没有骰子,我得到了这个:

db assertion failure, assertion: 'invoke failed: JS Error: TypeError: db has no properties nofile_b:18', assertionCode: 9004

我想这意味着它db在 finalize 方法中是未定义的。那么,有可能吗?

编辑

这是我的 finalize 方法:

function(key, value) {
  function flatten(value, collector) {
    var items = value;
    if (!(value instanceof Array)) {
      if (!value.items) {
        collector.push(value);
        return;
      }

      items = value.items;
    }
    for (var i = 0; i < items.length && collector.length < max_group_size; ++i) {
      flatten(items[i], collector);
    }
  }

  var collector = [];
  flatten(value, collector);
  return collector;
}

我想collector.push(value)用插入替换到某个集合中。

4

1 回答 1

2

无法从 Map/Reduce/Finalize 函数内部修改另一个集合。

这是来自有类似问题的用户提出的问题的链接。不幸的是,答案是“不”。
如何更改 MongoDB 的 map-reduce 结果的结构?

部分原因是 MapReduce 设计为在分片环境中工作。计算分布在不同的分片之间,然后汇总结果。如果每个分片上运行的每个函数都被允许修改集合,那么每个分片最终可能会得到不同的数据。

如果您希望通过 Map Reduce 操作修改单独的集合,最好的策略是运行 Map Reduce 操作,获取结果,然后让您的应用程序更新单独的集合。

如果您希望合并多个 Map Reduce 操作的结果,可以通过增量 Map Reduce 来实现。这方面的文档可以在这里找到:http ://www.mongodb.org/display/DOCS/MapReduce#MapReduce-IncrementalMapreduce

于 2012-04-04T14:59:07.373 回答