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

MongoDB Map Reduce将文档与动态模式相结合,mongodb,mapreduce,Mongodb,Mapreduce,我正在尝试我认为应该是一个简单的MapReduce,但是我遇到了麻烦,因为我找不到如何编写服务器端javascript的参考 有两份文件: { "_id" : ObjectId("530c8b58d95cd926144055d9"), "atomic" : "p", "doc" : { "d1" : "t" }, "array" : ["e"] }, { "_id" : ObjectId("530c8b71d95cd926144055da"), "atomic

我正在尝试我认为应该是一个简单的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;
 }
不正确的reduce函数是:

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;
 }
函数(键、值){
var reduced={doc:{},数组:[]};
值。forEach(函数(val){
对于(var i=0;i
带有数组的部分很好,它试图合并混乱的文档(即,由于缺少函数而无法执行)。我已经尝试了我能想到的所有排列——如果我将val.doc添加到一个数组中,那么它们都会出现,只是我不知道如何将其合并到单个文档中

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


任何帮助都将不胜感激。

不确定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;
 }
函数(键、值){
var reduced={doc:{},数组:[]};
值。forEach(函数(val){
对于(var i=0;i
Duh,有一件事我没有试过。谢谢