Mongodb $lookup嵌套数组对象的聚合

Mongodb $lookup嵌套数组对象的聚合,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有category集合,其中包含子类别嵌入对象。我需要编写聚合脚本,以便首次从该集合查找到storelisting集合。然后将storelisting字段添加到相应的子类别中 类别 门店列表 我需要查找集合上面的表单到storeListing集合。我还需要storeListing的所有字段 结果应该如下所示: { "_id": "", "categoryName": "", "subCateg

我有
category
集合,其中包含子类别嵌入对象。我需要编写聚合脚本,以便首次从该集合查找到
storelisting
集合。然后将storelisting字段添加到相应的子类别中

类别 门店列表 我需要查找集合上面的表单到storeListing集合。我还需要storeListing的所有字段

结果应该如下所示:

{
  "_id": "",
  "categoryName": "",
  "subCategories": [
    {
      "subCategoryId": "",
      "subCategoryName": "",
      "storeListingIds": [
        "1",
        "2"
      ],
      "storeListings":[
        {
          "_id": "1",
          "storeListingName": "",
          "storeListingUrl": "",
          "catalogueIds": [
            ""
          ],
          "_class": ""
        },
        {
          "_id": "2",
          "storeListingName": "",
          "storeListingUrl": "",
          "catalogueIds": [
            ""
          ],
          "_class": ""
        }
      ]
    },
    {
      "subCategoryId": "",
      "subCategoryName": "",
      "storeListingIds": [
        "3","4","5"
      ],
      "storeListings":[
        {
          "_id": "3",
          "storeListingName": "",
          "storeListingUrl": "",
          "catalogueIds": [
            ""
          ],
          "_class": ""
        },
        {
          "_id": "4",
          "storeListingName": "",
          "storeListingUrl": "",
          "catalogueIds": [
            ""
          ],
          "_class": ""
        },
        {
          "_id": "5",
          "storeListingName": "",
          "storeListingUrl": "",
          "catalogueIds": [
            ""
          ],
          "_class": ""
        }
      ]
    }
  ],
  "order": 2,
  "createdAt": {
    "$date": "2020-12-01T22:26:11.669Z"
  },
  "updatedAt": {
    "$date": "2021-04-27T17:17:25.442Z"
  },
  "_class": ""
}
解释
  • 我们对嵌套的
    storeListingId
    执行
    $lookup
    ,并将结果存储在
    tmp
    字段中
  • 我们应用筛选并将
    子类别
    对象与
    商店列表
    值合并
  • 注意:我们之所以使用
    $mergeObjects
    是为了避免命名
    子类别中的每个字段

    $map: {
        input: "$subCategories",
        as: "subCat",
        in: {
            subCategoryId:"$$subCat.subCategoryId",
            subCategoryName:"$$subCat.subCategoryName",
            storeListingIds: "$$subCat.storeListingIds",
            storeListening: {
                $filter: {
                    input: "$tmp",
                    cond: {
                      $in: [ "$$this._id", "$$subCat.storeListingIds" ]
                    }
                }
            }
        }
    }
    

    试试这个:

    db.category.aggregate([
      {
        $lookup: {
          from: "storelisting",
          localField: "subCategories.storeListingIds",
          foreignField: "_id",
          as: "tmp"
        }
      },
      {
        $addFields: {
          tmp: "$$REMOVE",
          subCategories: {
            $map: {
              input: "$subCategories",
              as: "subCat",
              in: {
                "$mergeObjects": [
                  "$$subCat",
                  {
                    storeListings: {
                      $filter: {
                        input: "$tmp",
                        cond: {
                          $in: [ "$$this._id", "$$subCat.storeListingIds" ]
                        }
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      }
    ])
    

    这个问题不够清楚。。你需要加入哪个系列?
    storeListingName
    和其他人是怎么来的?@varman我们有两个集合类别和storelisting,我们需要加入category和storelisting。要加入这个,我们需要检查“subCategories.storeListingIds”中的ID。storeListingName属性来自storeListing集合。这是storelisting集合的文档:{“_id”:“4”,“storeListingName”:“storeListingUrl”:“CatalogEIDS”:[“”],“_类”:“}
    $map: {
        input: "$subCategories",
        as: "subCat",
        in: {
            subCategoryId:"$$subCat.subCategoryId",
            subCategoryName:"$$subCat.subCategoryName",
            storeListingIds: "$$subCat.storeListingIds",
            storeListening: {
                $filter: {
                    input: "$tmp",
                    cond: {
                      $in: [ "$$this._id", "$$subCat.storeListingIds" ]
                    }
                }
            }
        }
    }
    
    db.category.aggregate([
      {
        $lookup: {
          from: "storelisting",
          localField: "subCategories.storeListingIds",
          foreignField: "_id",
          as: "tmp"
        }
      },
      {
        $addFields: {
          tmp: "$$REMOVE",
          subCategories: {
            $map: {
              input: "$subCategories",
              as: "subCat",
              in: {
                "$mergeObjects": [
                  "$$subCat",
                  {
                    storeListings: {
                      $filter: {
                        input: "$tmp",
                        cond: {
                          $in: [ "$$this._id", "$$subCat.storeListingIds" ]
                        }
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      }
    ])