Mongodb 从两个阶段计数

问题描述 投票:0回答:1

我也遇到过这样的情况。 我需要总记录数。然后应用过滤器,然后我需要过滤的产品和过滤的产品数量。

这是我的查询:

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: {} }
阶段,它就可以正常工作;该查询给了我过滤后的产品数组。

请帮助我改进查询。

mongodb count aggregate
1个回答
0
投票

当前查询不起作用的原因是管道中的阶段是相关的,这意味着阶段将根据上一阶段返回的结果执行操作。

对于您的场景,您需要单独/多个管道来计算

totalRecords
filteredRecords
data
。因此,需要[
$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"
    }
  }
])

演示@Mongo Playground

© www.soinside.com 2019 - 2024. All rights reserved.