如何在mongodb中合并来自不同集合的文档?

时间:2014-01-22 17:19:11

标签: 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});

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" } }

不确定我是否错过了一些明显的东西。

1 个答案:

答案 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]
}

希望这有帮助!