MongoDB - 聚合在2个集合中

时间:2017-04-04 19:11:12

标签: mongodb aggregation-framework

我有2个收藏品。

第一个集合:'firmaListesi'

{
    "_id" : ObjectId("58455d2d506c1cab1c82153c"),
    "value" : {
        "firmaid0" : ObjectId("58455d92506c1cab1c82153e"),
        "firmaid1" : ObjectId("5847afe2506c912e6e3a72a7"),
        "firmaid2" : ObjectId("5850f2e725108a44a813f93f"),
        "firmaid3" : ObjectId("58523f272510fae3c1345547")
    }
}
{
    "_id" : ObjectId("58455d2d506c1cab1c82154c"),
    "value" : {
        "firmaid0" : ObjectId("5850f2e725108a44a813f93f"),
        "firmaid1" : ObjectId("58523f272510fae3c1345547")
    }
}

第二个系列:'calisanSayisi'

{
    "_id" : ObjectId("58455d92506c1cab1c82153e"),
    "value" : 13.0
}
{
    "_id" : ObjectId("5850f2e725108a44a813f93f"),
    "value" : 1.0
}
{
    "_id" : ObjectId("58523f272510fae3c1345547"),
    "value" : 3.0
}

我希望与'calisanSayisi._id'和'firmaListesi.value.firmaid'建立联系。我希望以这种方式组合两个集合。我写的代码中有错误。但对于1个区域,这是有效的。你可以在图片中看到我想要的更好。我想为所有领域拍照。

我的结果

{
    "_id" : ObjectId("58455d2d506c1cab1c82153c"),
    "value" : {
        "firmaid0" : ObjectId("58455d92506c1cab1c82153e"),
        "firmaid1" : ObjectId("5847afe2506c912e6e3a72a7"),
        "firmaid2" : ObjectId("5850f2e725108a44a813f93f"),
        "firmaid3" : {
            "_id" : ObjectId("58523f272510fae3c1345547"),
            "value" : 3.0
        }
    }
}
{
    "_id" : ObjectId("58455d2d506c1cab1c82154c"),
    "value" : {
        "firmaid0" : ObjectId("5850f2e725108a44a813f93f"),
        "firmaid1" : ObjectId("58523f272510fae3c1345547")
    }
}

我的代码:

function birlestir(a,b) {
    db.firmaListesi.aggregate([
        {$lookup: {
            from: "calisanSayisi",
            localField: a,
            foreignField: "_id",
            as: a
        }},
        {$unwind: {path: b, preserveNullAndEmptyArrays: true}},
        {$out: "firmalarId"}
    ]);
}
for(var i=0; i < (Object.keys(db.firmalistesi.value).length); i++){
    var a = 'value.firmaid'+i;
    var b = '$'+a;
    birlestir(a,b);
}

代码中存在重大缺陷。但我找不到解决方案。你能帮忙吗?

修改

'firmaListesi'数组

{
    "_id" : ObjectId("58455d2d506c1cab1c82153c"),
    "value" : [ 
        ObjectId("58455d92506c1cab1c82153e"), 
        ObjectId("5847afe2506c912e6e3a72a7"), 
        ObjectId("5850f2e725108a44a813f93f"), 
        ObjectId("58523f272510fae3c1345547")
    ]
}
{
    "_id" : ObjectId("58455d2d506c1cab1c82154c"),
    "value" : [ 
        ObjectId("5850f2e725108a44a813f93f"), 
        ObjectId("58523f272510fae3c1345547")
    ]
}

1 个答案:

答案 0 :(得分:1)

您可以使用以下聚合管道。以下查询$unwind(3.4版本不需要此步骤)来自ObjectID's集合value字段的firmaListesi后跟$look这些calisanSayisi数组中b集合中的ObjectId。

下一步是$unwind b输出数组,然后$group firmaListesi _id以推送以前的输出值。最后一步是写入firmalarId集合。

db.firmaListesi.aggregate([
    {$unwind:"$value"},
    {$lookup: {
        from: "calisanSayisi",
        localField: "value",
        foreignField: "_id",
        as: "b"
    }},
    {$unwind: {path: "$b", preserveNullAndEmptyArrays: true}},
    {$group: {_id:"$_id", value:{$push:"$b"}}},
    {$out: "firmalarId"}
])