我也遇到过这样的情况。 我需要总记录数。然后应用过滤器,然后我需要过滤的产品和过滤的产品数量。
这是我的查询:
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: {} }
阶段,它就可以正常工作;该查询给了我过滤后的产品数组。
请帮助我改进查询。
当前查询不起作用的原因是管道中的阶段是相关的,这意味着阶段将根据上一阶段返回的结果执行操作。
对于您的场景,您需要单独/多个管道来计算
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"
}
}
])