MongoDB:Mapreduce:reduce->不支持多个

时间:2011-11-17 22:03:53

标签: mongodb

我有一个包含大约5个天文目录的MongoDB集合(名为“目录”)。其中一些目录相互引用,因此其中一个文档可能如下所示:

{ "_id" : ObjectId("4ec574a68e4e7a519166015f"), "bii" : 20.9519, "class" : 2480, "cpdname" : "CPD -21 6109", "decdeg" : -21.8417, "decpm" : 0.004, "dmname" : "-21 4299", "hdname" : "HD 145612", "lii" : 352.8556, "name" : "PPM 265262", "ppmname" : "PPM 265262", "radeg" : 243.2005, "rapm" : 0.0012, "vmag" : 9.6, "xref" : [ ] }

我想要做的是使用mapreduce将诸如“hdname”,“ppmname”等字段移动到外部参照阵列中(然后取消设置)。

所以我尝试一次一个,从hdname字段开始。这是map和reduce函数:

map = function() {
    for (var hdname in this.hdname) {
        emit(this._id,this.hdname);
    }
}


reduce = function(key, values) {
    var result = [];
    for (var hdname in values) {
        result.push(hdname);
    }
    return result;
}

我尝试在mongo shell中运行以下命令:

db.catalog.mapReduce(map, reduce,"catalog2");

不幸的是,我收到以下错误:

Thu Nov 17 15:52:17 uncaught exception: map reduce failed:{
    "assertion" : "reduce -> multiple not supported yet",
    "assertionCode" : 10075,
    "errmsg" : "db assertion failure",
    "ok" : 0
}

显然我是新手......有人可以帮忙吗?

杰森

3 个答案:

答案 0 :(得分:30)

文档说“目前,reduce函数的返回值不能是数组(通常是对象或数字)。”

所以改为创建一个对象并将数组包装在其中。还要确保reduce的输出与输入类型相同,因此您需要在map操作中发出类似的值。

但是......为什么要使用Map-Reduce来做到这一点?如果您发出_id值,则没有什么可以减少,因为每个键都是唯一的。为什么不迭代复制值并逐个更新每个记录的集合?

答案 1 :(得分:2)

我最近需要在我的reduce步骤中返回一个字典。通过

解决了这个问题
return values.toString();

在我的reducer代码中。之后我必须解析结果以获得个人,但这不是什么大问题......

答案 2 :(得分:0)

尝试在reduce函数中返回对象

reduce = function(key, values) {
   var result = [];
   for (var hdname in values) {
     result.push(hdname);
   }
   return {value:result};
}