MongoDB Map-Reduce将文档与动态模式相结合

时间:2014-02-25 13:13:47

标签: mongodb mapreduce

我正在尝试我认为应该是一个简单的地图缩小,但我遇到了麻烦,因为我找不到如何编写服务器端javascript的参考。

给出两份文件:

{
  "_id" : ObjectId("530c8b58d95cd926144055d9"),
  "atomic" : "p",
  "doc" : {
    "d1" : "t"
  },
  "array" : ["e"]
},
{
  "_id" : ObjectId("530c8b71d95cd926144055da"),
  "atomic" : "p",
  "doc" : {
    "d2" : "r"
  },
  "array" : ["f"]
}

我希望结果是

{
  "_id" : "p",
  "value" : {
    "doc" : {  
         "d1" : "t",
         "d2" : "r"
     },
    "array" : ["e", "f"]
  }
}

地图功能是:

function () {
    emit(
        this.atomic,                    
        {doc: this.doc, array: this.array}
    ); 
}

不正确的减少功能是:

function (key, values) {
var reduced = {doc:{}, array:[]};
values.forEach(function(val){
    for(var i = 0; i < val.array.length; i++)
        reduced.array.push(val.array[i]);
    val.doc.forEach(function(kvp){reduced.doc.add(kvp.key, kvp.value);});
});
return reduced;
 }

具有数组的部分很好,它正在尝试组合弄乱的文档(即由于缺少功能而不执行)。我已经尝试了所有可以想到的排列 - 如果我将val.doc添加到数组中然后它们都显示出来,那就是我无法弄清楚如何将它合并到单个文档中。

文档中的字段将是动态的,因此无法按名称引用它。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

不确定reduced.doc.add位是否有效。

也许试试:

function (key, values) {
var reduced = {doc:{}, array:[]};
values.forEach(function(val){
    for(var i = 0; i < val.array.length; i++)
        reduced.array.push(val.array[i]);
    for (kvp in val.doc){
        reduced.doc[kvp]=val.doc[kvp];
    }
});
return reduced;
 }