如何在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。不过还是谢谢你。