Sử dụng $facet để chạy nhiều pipeline song song
$facet cho phép xử lý nhiều aggregation pipeline độc lập trên cùng một tập dữ liệu đầu vào, trả về kết quả nhiều nhóm trong một truy vấn.
Dữ liệu mẫu
> db.demo765.insertMany([
{ Name: "John", Category: "ComputerScience", SubjectName: "MongoDB", Marks: 75 },
{ Name: "John", Category: "ComputerScience", SubjectName: "MySQL", Marks: 85 },
{ Name: "Chris", Category: "10th", SubjectName: "Math", Marks: 98 }
]);
Truy vấn: Tổng điểm theo Name và theo Category
db.demo765.aggregate([
{
$facet: {
ListOfName: [
{ $group: { _id: "$Name", Marks: { $sum: "$Marks" } } },
{ $project: { _id: false, Name: "$_id", Marks: 1 } }
],
ListOfCategory: [
{ $group: { _id: "$Category", Marks: { $sum: "$Marks" } } },
{ $project: { _id: false, Category: "$_id", Marks: 1 } }
]
}
}
]).pretty()
Kết quả
{
"ListOfName": [
{ "Marks": 98, "Name": "Chris" },
{ "Marks": 160, "Name": "John" }
],
"ListOfCategory": [
{ "Marks": 98, "Category": "10th" },
{ "Marks": 160, "Category": "ComputerScience" }
]
}
Một truy vấn trả về cả tổng điểm theo học sinh và theo chuyên ngành.