Mongodb从两个阶段计数

yk9xbfzb  于 2023-10-16  发布在  Go
关注(0)|答案(1)|浏览(79)

我有这种情况。我需要记录总数。然后应用过滤器,然后我需要过滤产品和过滤产品的数量。
以下是我查询:

let result = await Product.aggregate([
    { $group: { _id: null, totalRecords: { $sum: 1 } } },
    { $match: queries },
    { $group: { _id: null, filteredRecords: { $sum: 1 } } },
    { $project: {
        name: 1,
        description: 1,
        smallImage: 1,
        rPriceTM: 1,
        discount: 1,
        discountRate: 1,
        dPriceTM: 1,
        isNewProduct: 1
    } },
    { $sort: { _id: -1 } },
    { $skip: (currentPage - 1) * productsPerPage },
    { $limit: productsPerPage }
])

结果:[ { _id: null } ]
如果我省略{ $group: {} }阶段,它工作正常;这个查询给了我一个经过过滤的产品数组。
请帮助我改进查询。

bxfogqkk

bxfogqkk1#

当前查询不起作用的原因是管道中的阶段是依赖的,这意味着阶段将基于从前一阶段返回的结果执行操作。
对于您的场景,您需要单独/多个管道来计算totalRecordsfilteredRecordsdata。因此,需要$facet阶段。在最后一个阶段,您需要$project阶段来装饰从$facet阶段返回的结果的最终输出文档。

let result = await Product.aggregate([
  {
    $facet: {
      totalRecords: [
        {
          $count: "total"
        }
      ],
      filteredRecords: [
        {
          $match: queries
        },
        {
          $count: "total"
        }
      ],
      data: [
        {
          $match: queries
        },
        {
          $project: {
            name: 1,
            description: 1,
            smallImage: 1,
            rPriceTM: 1,
            discount: 1,
            discountRate: 1,
            dPriceTM: 1,
            isNewProduct: 1
          }
        },
        {
          $sort: {
            _id: -1
          }
        },
        {
          $skip: (currentPage - 1) * productsPerPage
        },
        {
          $limit: productsPerPage
        }
      ]
    }
  },
  {
    $project: {
      totalRecords: {
        $getField: {
          input: {
            $arrayElemAt: [
              "$totalRecords",
              0
            ]
          },
          field: "total"
        }
      },
      filteredRecords: {
        $getField: {
          input: {
            $arrayElemAt: [
              "$filteredRecords",
              0
            ]
          },
          field: "total"
        }
      },
      data: "$data"
    }
  }
])

Demo @ Mongo Playground

相关问题