MongoDB中的$ lookup提供了意外的数据结构结果

时间:2018-07-19 14:32:58

标签: mongodb aggregation-framework

我试图了解为什么我在MongoDB聚合中使用的$lookup产生了结果。

首先,我的初始数据如下:

"subscriptions": [
    {
        "agency": "3dg2672f145d0598be095634", // This is an ObjectId
        "memberType": "primary"
    }
]

现在,我想做的是一个简单的$lookup,为ObjectId提取相关数据,该数据目前已作为“代理商”字段的值填充。

我尝试做的是这样的$lookup

{
    "from" : "agencies",
    "localField" : "subscriptions.0.agency",
    "foreignField" : "_id",
    "as" : "subscriptions.0.agency"
}

因此,基本上我想做的是获取与该ObjectId引用相关的信息,并在此处填充它,以代替ObjectId当前所在的位置。

作为结果,我期望的是这样的事情:

"subscriptions": [
    {
        "agency": [
          { 
            _id: <id-value>,
            name: <name-value>,
            address: <address-value>
          }
        ],
        "memberType": "primary"
    }
]

相反,我最终得到了这个(现在找不到“ memberType”道具):

"subscriptions" : {
    "0" : {
        "agency" : [ <agency-data> ]
    }
}

为什么这是$lookup的结果,如何获得在此寻找的数据结构?

为进一步澄清,他们在文档中提到了$unwind之前是数组字段的$lookup之前。但是,在这种情况下,目标本地实际字段并由$lookup代替的实际本地字段不是数组,而是在数组内。所以我不清楚是什么问题。

2 个答案:

答案 0 :(得分:1)

您需要使用$unwind来将您的“ localField”与“ foreignField”进行匹配,然后使用$group来再次回滚到数组

db.collection.aggregate([
  { "$unwind": "$subsciption" },
  { "$lookup": {
    "from": Agency.collection.name,
    "localField": "subsciption.agency",
    "foreignField": "_id",
    "as": "subsciption.agency"
  }},
  { "$group": {
    "_id": "$_id",
    "memberType": { "$first": "$memberType" },
    "subsciption": { "$push": "$subsciption" },
  }}
])

答案 1 :(得分:0)

基本上,OP寻找的是在查找到另一个集合后将数据转换为所需格式。假设有两个集合C1C2,其中C1包含文档

{ "_id" : ObjectId("5b50b8ebfd2b5637081105c6"), "subscriptions" : [ { "agency" : "3dg", "memberyType" : "primary" } ] }

C2包含

{ "_id" : ObjectId("5b50b984fd2b5637081105c8"), "agency" : "3dg", "name" : "ABC", "address" : "1 some street" }

如果对数据库执行以下查询

db.C1.aggregate([
    {$unwind: "$subscriptions"}, 
    {
        $lookup: {
            from: "C2", 
            localField: "subscriptions.agency", 
            foreignField: "agency", 
            as: "subscriptions.agency"
        }
    }
])

我们得到结果

{
    "_id": ObjectId("5b50b8ebfd2b5637081105c6"),
    "subscriptions": {
        "agency": [{
            "_id": ObjectId("5b50b984fd2b5637081105c8"),
            "agency": "3dg",
            "name": "ABC",
            "address": "1 some street"
        }],
        "memberyType": "primary"
    }
}

这与OP的预期非常接近。

  

注意:可能会有一些极端情况,但需要进行一些细微调整,此解决方案应该有效