如何在mongodb中合并来自不同集合的文档?
我知道这个问题已经被问了好几次了,但我的问题都没能解决 这是我的步骤如何在mongodb中合并来自不同集合的文档?,mongodb,Mongodb,我知道这个问题已经被问了好几次了,但我的问题都没能解决 这是我的步骤 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}); c
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" } }
不确定我是否错过了一些明显的东西 您可以通过如下更改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;
};
col1_r = function(key, values) {
return values[0]
}
然后将输出操作更改为“减少”:
这将导致输出中具有相同键的文档通过reduce函数传递,reduce函数进行字段合并
顺便说一句,col1_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;
};
col1_r = function(key, values) {
return values[0]
}
希望这有帮助 您是将此作为一次性处理作业(即重新配置架构以供将来使用)还是作为常规操作(即每次查询数据库时都希望发生类似的情况)?这是一个一次性过程。我只想合并数据以查看合并的数据。我意识到这可以用另一种方式完成,但我已经拥有了Mongo中的所有数据。啊,那么我建议不要尝试使用
mapReduce
,而只是使用for
循环等蛮力方式来完成。只需迭代您的ID,提取您需要的信息,然后将其插入到一个新集合中,这一切都可以通过mongo控制台中的脚本来完成。如果你想继续使用mapReduce,我相信这里还有其他人比我更有这方面的经验:)谢谢@3rf,但我有超过1000万个文档,这就是为什么我要研究mapReduce。不过还是谢谢你。