使用MongoDB中的mapReduce加入/交叉

时间:2013-07-11 17:31:56

标签: mongodb mapreduce

我想对两个不同的文档集执行连接操作,这两个文档有一个共同的字段。我有以下设置。

收藏A

{
    "common_key" : "v1" ,
    "a2" : "v2",
    "a3" : "v3",
    .....
}

收藏B

{
    "common_key" : "v1" ,
    "b2" : "z2",
    "b3" : "z3",
    .....
}

由于mapReduce只能处理一个集合,因此我将A和B的内容合并到集合Combo中。此外,我又添加了一个字段_dataType来表示它是A型还是B型

收藏组合= A + B

{
    "common_key" : "v1" ,
    "b2" : "z2",
    "b3" : "z3",
    "_dataType" : "B",
    .....
}

{
    "common_key" : "v1" ,
    "a2" : "v2",
    "a3" : "v3",
    "_dataType" : "A",
    .....
}

我想编写一个mapReduce函数,以便对于每种数据类型A和A具有相同common_key的所有文档。 B它应该输出

{
    "common_key" : v1 ,
    "A" : [
            { 
              "a2" : "v2",
              "a3" : "v3",
              ...
             },
             ...
           ],
    "B" : [
            {
                "b2" : "z2",
                "b3" : "z3",
                .....
           },
           ..
           ]
}

非常感谢任何指针或帮助

1 个答案:

答案 0 :(得分:0)

使用聚合框架快速回答

db.coll.aggregate({
    "$group": {
        "_id": "$common_key",
        "A": {
            "$push": {
                "$cond": [
                    {
                        "$eq": [
                            "$_dataType",
                            "A"
                        ]
                    },
                    {
                        "a2": "$a2",
                        "a3": "$a3"
                        // you have to put all A dataType field here
                    }, 
                    {}
                ]
            }
        },
        "B": {
            "$push": {
                "$cond": [
                    {
                        "$eq": [
                            "$_dataType",
                            "B"
                        ]
                    },
                    {
                        "b2": "$b2",
                        "b3": "$b3"
                        // you have to put all B dataType field here
                    },
                    {}
                ]
            }
        }
    }
})

缺点:您必须编写A和B数据类型的所有字段来投影它们,并且每个数组(A和B)上都有空对象