我试图将要更新的集合作为范围变量传递,而不是骰子。我试图从finalize body调用db.getCollection
——没有骰子,我得到了这个:
db assertion failure, assertion: 'invoke failed: JS Error: TypeError: db has no properties nofile_b:18', assertionCode: 9004
我想这意味着db
在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)
替换为插入某个集合。
不可能从Map/Reduce/Finilize函数内部修改另一个集合。
这里有一个链接,指向一个有类似问题的用户提出的问题。不幸的是,答案是"不"
如何更改MongoDB的结构';s映射减少结果?
部分原因是MapReduce是为在分片环境中工作而设计的。计算分布在不同的碎片之间,然后对结果进行聚合。如果每个碎片上运行的每个函数都被允许修改集合,那么每个碎片最终可能会得到不同的数据。
如果您希望通过Map Reduce操作修改单独的集合,最好的策略是运行Map Reduce运算,获取结果,然后让您的应用程序更新单独的集合。
如果希望合并多个Map Reduce操作的结果,可以通过增量Map Reduce来实现。有关此方面的文档可在此处找到:http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-IncrementalMapreduce