【问题标题】:i want aggregate in array into array mongodb我想在数组中聚合到数组 mongodb
【发布时间】:2021-01-16 04:25:31
【问题描述】:

我有三个不同的集合,每个表都用唯一的 objectid 连接。 这是 mongodb 数据库..

collection1 => cate = {
    "_id" : ObjectId("5ff98328dcb22e2f9fd23835"),
    "name" : "home & kitchen"
},{
    "_id" : ObjectId("5ff98328dcb22e2f9fd23836"),
    "name" : "shoes"
}

collection2 => subcate = {
    "_id" : ObjectId("5ff9837ddcb22e2f9fd23890"),
    "cate" : ObjectId("5ff98328dcb22e2f9fd23835"),
    "name" : "dish"
},
{
    "_id" : ObjectId("5ff9837ddcb22e2f9fd23891"),
    "cate" : ObjectId("5ff98328dcb22e2f9fd23835"),
    "name" : "dish 2"
}

collection3 => petacate ={
    "_id" : ObjectId("5ff983abdcb22e2f9fd238c8"),
    "subcate" : ObjectId("5ff9837ddcb22e2f9fd23890"),
    "cate" : ObjectId("5ff98328dcb22e2f9fd23835"),
    "name" : "small dish"
},
{
    "_id" : ObjectId("5ff983abdcb22e2f9fd238c7"),
    "subcate" : ObjectId("5ff9837ddcb22e2f9fd23890"),
    "cate" : ObjectId("5ff98328dcb22e2f9fd23835"),
    "name" : "big dish"
}

我在这门语言方面比较大,我想要这种类型的结果汇总。我正在尝试解决这个问题,但我不能。

collection1 _id 与collection2 cate 相连,collection1 和collection2 都依次与collection3 相连cate & subcate

cat: {
        _id: "5ff98328dcb22e2f9fd23835",
        name: "home & kitchen",
        subcate: [
            {
                _id: "5ff9837ddcb22e2f9fd23890",
                cate: "5ff98328dcb22e2f9fd23835",
                name: "dish",
                petacate: [
                    {
                        _id: "5ff983abdcb22e2f9fd238c8",
                        subcate: "5ff9837ddcb22e2f9fd23890",
                        cate: "5ff98328dcb22e2f9fd23835",
                        name: "small dish"
                    },
                    {
                       _id : ObjectId("5ff983abdcb22e2f9fd238c7"),
                       subcate : ObjectId("5ff9837ddcb22e2f9fd23890"),
                       cate : ObjectId("5ff98328dcb22e2f9fd23835"),
                       name : "big dish"
                    }
                ]
            }
        ]
    }

【问题讨论】:

    标签: node.js database mongodb aggregate


    【解决方案1】:

    当您加入收藏时,您必须使用$lookup。有两种查找。两者都在这里使用。

    • 第一个$lookup 是加入集合的standard lookup,条件是_idcate 等于catesubcate
    • $unwind 解构数组。 (数组到对象)
    • 第二个$lookupuncorrelated lookup 使用多个条件。当你使用这种查找时,你需要在$match阶段使用$expr。使用$match,我们有条件地检查了subcatecate
    • $group是重构解构的数组

    这是脚本

    db.cate.aggregate([
      {
        "$lookup": {
          "from": "subcate",
          "localField": "_id",
          "foreignField": "cate",
          "as": "subcate"
        }
      },
      { "$unwind": "$subcate" },
      {
        "$lookup": {
          "from": "petacate",
          "let": { cId: "$subcate.cate", sId: "$subcate._id"},
          "pipeline": [
            {
              $match: {
                $expr: {
                  $and: [
                    { $eq: [ "$subcate", "$$sId" ] },
                    { $eq: [ "$cate", "$$cId" ] },
                    
                  ]
                }
              }
            }
          ],
          "as": "subcate.petacate"
        }
      },
      {
        "$group": {
          "_id": "$_id",
          "name": { "$first": "$name" },
          "subcate": { $push: "$subcate" }
        }
      }
    ])
    

    工作Mongo playground

    更新 1

    $unwind 默认行为是在数组为空或空时删除。为了防止它,我们这样做

    {
        "$unwind": {
          path: "$subcate",
          preserveNullAndEmptyArrays: true
        }
      }
    

    注意:这可能会根据以下阶段生成空数组或空对象。如果不需要,使用$match with condition 删除空数组或对象

    【讨论】:

    • 当子类别不可用时,即使我想在数组列表中显示我的鞋子
    猜你喜欢
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 2021-11-20
    • 2021-06-27
    • 2021-12-01
    相关资源
    最近更新 更多