0

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

集合 A

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

集合 B

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

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

收藏组合 = A + B

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

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

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

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

非常感谢任何指示或帮助

4

1 回答 1

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)上都有空对象

于 2013-07-11T18:02:51.610 回答