Tổng số sẽ luôn là kết quả một tài liệu, vì vậy bạn cần $ facet
để chạy các đường ống tổng hợp lẫn nhau và sau đó hợp nhất các kết quả. Giả sử đường dẫn thông thường của bạn chứa $project
đơn giản và bạn muốn hợp nhất kết quả của nó với $count
. Bạn có thể chạy tập hợp dưới đây:
db.col.aggregate([
{
$facet: {
totalCount: [
{ $count: "value" }
],
pipelineResults: [
{
$project: { _id: 1 } // your regular aggregation pipeline here
}
]
}
},
{
$unwind: "$pipelineResults"
},
{
$unwind: "$totalCount"
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: [ "$pipelineResults", { totalCount: "$totalCount.value" } ]
}
}
}
])
Sau $facet
bạn sẽ nhận được một tài liệu như thế này
{
"totalCount" : [
{
"value" : 3
}
],
"pipelineResults" : [
{
"_id" : ObjectId("5b313241120e4bc08ce87e46")
},
//....
]
}
Sau đó, bạn phải sử dụng $ unwind để chuyển đổi mảng thành nhiều tài liệu và $ ReplaceRoot với $ mergeObjects để thúc đẩy các kết quả chuyển tiếp thường xuyên đến cấp cơ sở.