【问题标题】:MongoDB: Mapreduce: reduce->multiple not supported yetMongoDB:Mapreduce:reduce->multiple 尚不支持
【发布时间】:2011-12-31 18:43:04
【问题描述】:

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

{ "_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
}

显然我是个新手...谁能帮忙?

杰森

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

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

    但是...为什么要使用 Map-Reduce 来做到这一点?如果您发出 _id 值,则无需减少任何内容,因为每个键都是唯一的。为什么不只遍历集合并复制值并逐条更新每条记录?

    【讨论】:

    【解决方案2】:

    我最近还需要在 reduce 步骤中返回字典。通过这样做解决了这个问题

    return values.toString();
    

    在我的减速器代码中。之后我必须解析结果以获取个人,但这没什么大不了的......

    【讨论】:

      【解决方案3】:

      尝试在reduce函数中返回对象

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

      【讨论】:

        猜你喜欢
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-17
        • 2014-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多