首页 文章

是否可以从map reduce引擎的finalize方法更新mongo集合?

提问于
浏览
3

我试图将集合作为范围变量传递给更新 - 没有骰子 . 我试图从最终的身体调用 db.getCollection - 没有骰子,我明白了:

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

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

EDIT

这是我的终结方法:

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) 替换为插入到某个集合中 .

1 回答

  • 2

    无法从Map / Reduce / Finalize函数中修改另一个集合 .

    以下是来自具有类似问题的用户的问题的链接 . 不幸的是,答案是"no" .
    How to change the structure of MongoDB's map-reduce results?

    部分原因是MapReduce旨在在分片环境中工作 . 计算分布在不同的分片中,然后聚合结果 . 如果允许在每个分片上运行的每个函数修改集合,则每个分片最终可能会有不同的数据 .

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

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

相关问题