Mongodb$unwind删除对象。如果$lookup没有';我没有参考资料

Mongodb$unwind删除对象。如果$lookup没有';我没有参考资料,mongodb,mongoose,mongodb-query,Mongodb,Mongoose,Mongodb Query,如果国家没有参考州和城市$“展开”将从集合中删除国家/地区名称 预期输出为Mongodb,即使国家没有任何州和城市引用,Mongodb也应返回国家名称 国家/地区系列: [ { "_id": "5d052c76df076d23a48d4a3b", "name": "India" }, { "_id": "5d052c76df076d23a48d4b07", "name": "Indonesia" }, { "_id": "5d052c7

如果国家没有参考州和城市$“展开”将从集合中删除国家/地区名称

预期输出为Mongodb,即使国家没有任何州和城市引用,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":[

      ]
   }
]
状态集合:

[
  {
    "_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":[

      ]
   }
]
城市系列:

[
  {
    "_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":[

      ]
   }
]
]

查询:

[
  {
    "_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":[

      ]
   }
]
输出:

[
  {
    "_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":[

      ]
   }
]
预期输出:

[
  {
    "_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":[

      ]
   }
]
只需将“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"
    }
]
只需将“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"
    }
]

有没有办法删除城市空结果?有没有办法删除城市空结果?