我知道这个问题已被问过几次,但我无法让我的工作。
这是我的步骤
db.col1.insert({"product_id" : 1, "title" : "Sharpie"});
db.col1.insert({"product_id" : 2, "title" : "Sticky"});
db.col2.insert({"product_id" : 1, "price" : 99});
db.col2.insert({"product_id" : 2, "price" : 30});
col1_map = function() {
emit(this.product_id, {"title" : this.title});
}
col1_r = function(key, values) {
var result = {
"title" : ""
};
values.forEach(function(value) {
result.title = value.title;
});
return result;
}
col2_map = function() {
emit(this.product_id, {"price" : this.price});
};
col2_r = function(key, values) {
var result = {
"price" : ""
};
values.forEach(function(value) {
result.price = value.price;
});
return result;
};
res = db.col1.mapReduce(col1_map, col1_r, {out: {merge : 'joined'}});
res = db.col2.mapReduce(col2_map, col2_r, {out: {merge : 'joined'}});
我得到的结果就是这个
>> db.joined.find();
{ "_id" : 1, "value" : { "price" : 99 } }
{ "_id" : 2, "value" : { "price" : 30 } }
我想要的是什么
{ "_id" : 1, "value" : { "price" : 99, "title" : "Sharpie" } }
{ "_id" : 2, "value" : { "price" : 30, "title" : "Sticky" } }
不确定我是否错过了一些明显的东西。
答案 0 :(得分:0)
您可以通过更改col2_r reduce函数获得所需的结果,如下所示:
col2_r = function(key, values) {
var result = {};
values.forEach(function(value) {
if ('title' in value)
result.title = value.title;
if ('price' in value)
result.price = value.price;
});
return result;
};
然后将输出操作更改为“reduce”:
res = db.col1.mapReduce(col1_map, col1_r, {out: {reduce : 'joined'}});
res = db.col2.mapReduce(col2_map, col2_r, {out: {reduce : 'joined'}});
这将导致输出中具有相同键的文档通过reduce函数传递,该函数将合并字段。
顺便说一句,col1_r reduce函数的工作方式如下所示,但可以简化如下:
col1_r = function(key, values) {
return values[0]
}
希望这有帮助!