MongoDB:获取引用架构中的文档计数

MongoDB:获取引用架构中的文档计数,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我有3个系列类别,子类别和产品 参考资料 category\u id在子类别中引用 products 我怎样才能得到 每个类别中产品的数量 每个类别中子类别的数量 每个子类别中产品的数量 -当我查询类别时,我应该在其中获得类别名称和产品计数。 -当我查询子类别时,我应该在其中获得子类别名称和产品计数。 模式示例: //类别 [ { _id:“5f886eb2d41da75dd5a90bfc” catName:“catName 1” }, { _id:“5f886eb2d41da75dd5a90b

我有3个系列
类别
子类别
产品

参考资料

  • category\u id
    子类别中引用
  • products
  • 我怎样才能得到

  • 每个
    类别中
    产品的数量
  • 每个
    类别中
    子类别的数量
  • 每个
    子类别中
    产品的数量
  • -当我查询类别时,我应该在其中获得
    类别名称
    产品计数
    。 -当我查询子类别时,我应该在其中获得
    子类别名称
    产品计数
    模式示例:

    //类别
    [
    {
    _id:“5f886eb2d41da75dd5a90bfc”
    catName:“catName 1”
    },
    {
    _id:“5f886eb2d41da75dd5a90bfd”
    猫名:“猫名2”
    }
    ]
    
    //子类别
    [
    {
    _id:“6f886eb2d41da75dd5a90bfc”
    子类别名称:“子类别名称1”,
    类别:“5f886eb2d41da75dd5a90bfc”//1类
    },
    {
    _id:“6f886eb2d41da75dd5a90bfd”
    子类别名称:“子类别名称2”,
    类别:“5f886eb2d41da75dd5a90bfc”//1类
    },
    {
    _id:“6f886eb2d41da75dd5a90bfa”
    子类别名称:“子类别名称2”,
    类别:“5f886eb2d41da75dd5a90bfd”//2类
    }
    ]
    
    //产品
    [
    {
    _id:“1f886eb2d41da75dd5a90bfd”
    产品名称:“产品名称1”,
    子类别:“6f886eb2d41da75dd5a90bfc”//子类别1
    },
    {
    _id:“2f886eb2d41da75dd5a90bfd”
    产品名称:“产品名称2”,
    子类别:“6f886eb2d41da75dd5a90bfc”//子类别1
    }
    ]
    
    当我查询类别时,我应该得到类别名称和其中产品的数量。
    • $lookup
      加入子类别集合,在let中传递类别id
    • $match
      类别id条件
    • $lookup
      加入产品系列
    • $project
      使用
      $size
    • $project
      显示必填字段,
      $reduce
      获取每个子类别的产品总数


    当我查询子类别时,我应该得到子类别名称和其中产品的数量。
    • $lookup
      加入产品系列
    • $project
      要显示必填字段,请使用
      $size

    [
     {
       name: "catName 1",
       products: 2
     },
    {
       name: "catName 1",
       products: 0
     }
    ]
    
    [
     {
       name: "subCatName 1",
       products: 2
     },
    {
       name: "subCatName 1",
       products: 0
     },
    {
       name: "subCatName 3",
       products: 0
     }
    ]
    
    db.category.aggregate([
      {
        $lookup: {
          from: "subcategory",
          let: { category: "$_id" },
          pipeline: [
            { $match: { $expr: { $eq: ["$$category", "$category"] } } },
            {
              $lookup: {
                from: "product",
                localField: "_id",
                foreignField: "subcategory",
                as: "products"
              }
            },
            { $project: { products: { $size: "$products" } } }
          ],
          as: "products"
        }
      },
      {
        $project: {
          _id: 0,
          name: "$catName",
          products: {
            $reduce: {
              input: "$products",
              initialValue: 0,
              in: { $add: ["$$value", "$$this.products"] }
            }
          }
        }
      }
    ])
    
    db.subcategory.aggregate([
      {
        $lookup: {
          from: "product",
          localField: "_id",
          foreignField: "subcategory",
          as: "products"
        }
      },
      {
        $project: {
          _id: 0,
          name: "$subCatName",
          products: { $size: "$products" }
        }
      }
    ])