【问题标题】:Mongodb $unwind removes objects. if $lookup doesn't have reference [duplicate]Mongodb $unwind 删除对象。如果 $lookup 没有参考 [重复]
【发布时间】:2019-07-24 20:40:21
【问题描述】:

如果国家/地区没有参考州和城市。 $unwind 从集合中删除国家名称。

预期输出将是 Mongodb 应返回国家/地区名称,即使该国家/地区没有任何州和城市参考。

国家合集:

[
  {
    "_id": "5d052c76df076d23a48d4a3b",
    "name": "India"
  },
  {
    "_id": "5d052c76df076d23a48d4b07",
    "name": "Indonesia"
  },
  {
    "_id": "5d052c76df076d23a48d22f4",
    "name": "Iran"
  }
]

状态集合:

   [
      {
        "_id": "5d2236c37ed1112b3cc41397",
        "name": "Andaman and Nicobar Islands",
        "countryId": "5d052c76df076d23a48d4a3b"
      },
      {
        "_id": "5d2236c37ed1112b3cc41398",
        "name": "Andhra Pradesh",
        "countryId": "5d052c76df076d23a48d4a3b"
      }
    ]

城市收藏:

[
   {
     "name": "Port Blair",
     "stateId": "5d2236c37ed1112b3cc41397"
   },
   {
     "name": "Adoni",
     "stateId": "5d2236c37ed1112b3cc41398"
   }

]

查询:

Country.aggregate([
    {
        $lookup:{
            from: 'states',
            localField:'_id',
            foreignField:'countryId',
            as:'states'
        }
    },
    {
        $unwind: {
            path: "$states"
        }
    },
    {
        $lookup:{
            from: 'cities',
            localField:'states._id',
            foreignField:'stateId',
            as:'states.cities'
        }
    },
    {
        $group: {
            _id: {
                _id: '$_id',
                name: '$name'
            },
            states: {
                $push: '$states'
            }
        }
    },
    {
        $project: {
            _id: '$_id._id',
            name: '$_id.name',
            states: 1
        }
    }
])

输出:

[
   {
      "_id":"5d052c76df076d23a48d4a3b",
      "name":"India",
      "states":[
         {
            "_id":"5d2236c37ed1112b3cc41397",
            "name":"Andaman and Nicobar Islands",
            "countryId":"5d052c76df076d23a48d4a3b",
            "cities":[
               {
                  "name":"Port Blair",
                  "stateId":"5d2236c37ed1112b3cc41397"
               }
            ]
         },
         {
            "_id":"5d2236c37ed1112b3cc41398",
            "name":"Andhra Pradesh",
            "countryId":"5d052c76df076d23a48d4a3b",
            "cities":[
               {
                  "name":"Adoni",
                  "stateId":"5d2236c37ed1112b3cc41398"
               }
            ]
         }
      ]
   }
]

预期输出:

[
   {
      "_id":"5d052c76df076d23a48d4a3b",
      "name":"India",
      "states":[
         {
            "_id":"5d2236c37ed1112b3cc41397",
            "name":"Andaman and Nicobar Islands",
            "countryId":"5d052c76df076d23a48d4a3b",
            "cities":[
               {
                  "name":"Port Blair",
                  "stateId":"5d2236c37ed1112b3cc41397"
               }
            ]
         },
         {
            "_id":"5d2236c37ed1112b3cc41398",
            "name":"Andhra Pradesh",
            "countryId":"5d052c76df076d23a48d4a3b",
            "cities":[
               {
                  "name":"Adoni",
                  "stateId":"5d2236c37ed1112b3cc41398"
               }
            ]
         }
      ]
   },
   {
      "_id":"5d052c76df076d23a48d4b07",
      "name":"Indonesia",
      "states":[

      ]
   },
   {
      "_id":"5d052c76df076d23a48d22f4",
      "name":"Iran",
      "states":[

      ]
   }
]

【问题讨论】:

    标签: mongodb mongoose mongodb-query


    【解决方案1】:

    只需将“preserveNullAndEmptyArrays: true”添加到$unwind

    Country.aggregate([
        {
            $lookup:{
                from: 'states',
                localField:'_id',
                foreignField:'countryId',
                as:'states'
            }
        },
        {
            $unwind: {
                path: "$states",
                preserveNullAndEmptyArrays: true
            }
        },
        {
            $lookup:{
                from: 'cities',
                localField:'states._id',
                foreignField:'stateId',
                as:'states.cities'
            }
        },
        {
            $group: {
                _id: {
                    _id: '$_id',
                    name: '$name'
                },
                states: {
                    $push: '$states'
                }
            }
        },
        {
            $project: {
                _id: '$_id._id',
                name: '$_id.name',
                states: 1
            }
        }
    ])
    

    输出

    [
        {
            "states" : [ 
                {
                    "cities" : []
                }
            ],
            "_id" : "5d052c76df076d23a48d22f4",
            "name" : "Iran"
        },
        {
            "states" : [ 
                {
                    "cities" : []
                }
            ],
            "_id" : "5d052c76df076d23a48d4b07",
            "name" : "Indonesia"
        },
        {
            "states" : [ 
                {
                    "_id" : "5d2236c37ed1112b3cc41397",
                    "name" : "Andaman and Nicobar Islands",
                    "countryId" : "5d052c76df076d23a48d4a3b",
                    "cities" : [ 
                        {
                            "_id" : ObjectId("5d38ccb6f9c5fa48bf099027"),
                            "name" : "Port Blair",
                            "stateId" : "5d2236c37ed1112b3cc41397"
                        }
                    ]
                }, 
                {
                    "_id" : "5d2236c37ed1112b3cc41398",
                    "name" : "Andhra Pradesh",
                    "countryId" : "5d052c76df076d23a48d4a3b",
                    "cities" : [ 
                        {
                            "_id" : ObjectId("5d38ccbcf9c5fa48bf09902a"),
                            "name" : "Adoni",
                            "stateId" : "5d2236c37ed1112b3cc41398"
                        }
                    ]
                }
            ],
            "_id" : "5d052c76df076d23a48d4a3b",
            "name" : "India"
        }
    ]
    

    【讨论】:

    • 有什么办法可以去掉城市空结果?
    猜你喜欢
    • 1970-01-01
    • 2019-09-03
    • 2016-05-27
    • 2012-09-23
    • 2021-06-11
    相关资源
    最近更新 更多