2014-02-25 38 views
1

我在想我应该是一个简单的地图减少,但我有麻烦,因为我找不到如何编写服务器端JavaScript的参考。MongoDB Map-Reduce将文档与动态模式结合起来

假设有两个文件:

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

不确定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; 
} 
+1

咄,有一件事我没有尝试。谢谢! – mikkelfishman

相关问题