我正在尝试我认为应该是一个简单的地图缩小,但我遇到了麻烦,因为我找不到如何编写服务器端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添加到数组中然后它们都显示出来,那就是我无法弄清楚如何将它合并到单个文档中。
文档中的字段将是动态的,因此无法按名称引用它。
任何帮助都将不胜感激。
答案 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;
}