MongoDB-通过将一个集合中的对象嵌套到另一个集合的对象数组中来聚合两个数组

时间:2018-08-17 09:23:28

标签: mongodb mongodb-query

我正在尝试正确编写一个查询,该查询将连接两个集合中的对象。在一个集合(A)中,例如,我具有带有字段和用户数组的对象,每个用户对象都有一个userDetailsId,当将每个用户与每个他的userDetails合并/合并时,我将使用该userDetailsId集合B。

集合A:

{
    "_id": "1",
    "field1": "value1",
    "field2": "value2",
    "users": [
        {
            "userField1": "value3",
            "userField2": "value4",
            "userDetailsId": "100"
        },{
            "userField1": "value5",
            "userField2": "value6",
            "userDetailsId": "200"
        }
    ]
}

集合B:

{
    "_id": "100",
    "field1": "value1",
    "field2": "value2",
    "object1": {
        "field3": "value3",
        "field4": "value4"
    },
    "object2": {
        "field5": "value5",
        "field6": "value6"
    }
},
{
    "_id": "200",
    "field1": "value1",
    "field2": "value2",
    "object1": {
        "field3": "value3",
        "field4": "value4"
    },
    "object2": {
        "field5": "value5",
        "field6": "value6"
    }
}

首选结果:

{
    "_id": "1",
    "field1": "value1",
    "field2": "value2",
    "users": [
        {
            "userField1": "value3",
            "userField2": "value4",
            "userDetailsId": "100",
            "userDetails":{
                "_id": "100",
                "field1": "value1",
                "field2": "value2",
                "object1": {
                    "field3": "value3",
                    "field4": "value4"
                },
                "object2": {
                    "field5": "value5",
                    "field6": "value6"
                }
            }
        },{
            "userField1": "value5",
            "userField2": "value6",
            "userDetailsId": "200",
            "userDetails":{
                "_id": "200",
                "field1": "value1",
                "field2": "value2",
                "object1": {
                    "field3": "value3",
                    "field4": "value4"
                },
                "object2": {
                    "field5": "value5",
                    "field6": "value6"
                }
            }
        }
    ]
}

我写了一个查询,但没有得到首选结果:

db.collectiona.aggregate([{$match: {'_id':1}},{$lookup:{from:"collectionb", localField: "users.userdetailsid", foreignField: "_id", as:"userdetails"}}

如果运行此命令,我将只合并这两个集合,并将集合B中所有匹配的userdetails对象包含在结果内部作为userdetails数组。

由于我的目标是将用户及其用户详细信息合并到用户对象中,因此我尝试将设置为:“ users.userdetails” ,但这将用用户详细信息数据替换用户(未找到匹配userdetailsid时,将upsert设置为true并在用户中添加整个userdetails对象的可能方法。

之后,我尝试通过管道传递聚合结果,并尝试将userdetails与查询一起放入用户对象

db.collectiona.aggregate([{$match: {'_id':1}},{$lookup:{from:"collectionb", localField: "users.userdetailsid", foreignField: "_id", as:"userdetails"},
{"$addFields":{
    "user.userdetails":{
        "$map":{
            "input": "$shifts",
            "in":{
                "$mergeObjects":["$$this",{"$arrayElemAt":["$collectionb",{"$indexOfArray":["$collectionb.id","$$this.userdetailsid"]}]}]
                }
            }
        }
    }}
}

但这也不好。

您有任何想法如何正确编写查询以得到这种结果?

1 个答案:

答案 0 :(得分:1)

您需要首先$unwind users数组以与正确的userDetailsId匹配,然后$group$push来将用户再次回滚到数组中< / p>

db.collectiona.aggregate([
  { "$match": { "_id": 1 }},
  { "$unwind": "$users" },
  { "$lookup": {
    "from": "collectionb",
    "localField": "users.userDetailsId",
    "foreignField": "_id",
    "as": "users.userDetails"
  }},
  { "$unwind": "$users.userDetails" },
  { "$group": {
    "_id": "$_id",
    "field1": { "$first": "field1" }
    "field2": { "$first": "field2" }
    "users": { "$push": "users" }
  }}
])