Toán tử giai đoạn $group MongoDB nhóm các tài liệu theo một số biểu thức được chỉ định và nhóm tài liệu cho từng nhóm riêng biệt. Trường _id trong tài liệu đầu ra chứa nhóm riêng biệt theo khóa. Các tài liệu đầu ra cũng có thể chứa các trường được tính toán chứa các giá trị của một số biểu thức bộ tích lũy được nhóm theo trường _id của $group. Toán tử này không đặt hàng các tài liệu đầu ra của nó
cú pháp
{ $group: { _id: , : { : }, .. } }
Những điểm cần nhớ
- Trường _id là bắt buộc;
- The rest of the fields eligible to be computed are optional and computed using the operators.
- The _id and the expressions can accept any valid expression.
Hóa đơn lấy mẫu
{
"_id" : 1,
"item" : "doz",
"qty" : 20,
"rate" : 10,
"inv_date" : "02/02/2014"
}
{
"_id" : 2,
"item" : "sam",
"qty" : 15,
"rate" : 8,
"inv_date" : "05/12/2014"
}
{
"_id" : 3,
"item" : "amp",
"qty" : 25,
"rate" : 8,
"inv_date" : "07/02/2014"
}
{
"_id" : 4,
"item" : "doz",
"qty" : 20,
"rate" : 10,
"inv_date" : "02/02/2014"
}
{
"_id" : 5,
"item" : "amp",
"qty" : 10,
"rate" : 8,
"inv_date" : "05/12/2014"
}
{
"_id" : 6,
"item" : "doz",
"qty" : 30,
"rate" : 10,
"inv_date" : "13/04/2014"
}
{
"_id" : 7,
"item" : "sam",
"qty" : 15,
"rate" : 8,
"inv_date" : "05/12/2014"
}
{
"_id" : null,
"item" : "mks",
"qty" : 10,
"rate" : 20,
"inv_date" : "17/12/2014"
}
Ví dụ 1. nhóm $
Ví dụ sau nhóm theo trường ngày lập hóa đơn và hiển thị tổng chi phí, số lượng trung bình và số lượng hóa đơn trong cùng một ngày
db.invoice.aggregate[
[
{
$group : {_id : "$inv_date",
totalCost: { $sum: { $multiply: [ "$rate", "$qty" ] } },
avgQty: { $avg: "$qty" },
count: { $sum: 1 }
}
}
]
].pretty[];
đầu ra
{ "_id" : "17/12/2014", "totalCost" : 200, "avgQty" : 10, "count" : 1 } { "_id" : "13/04/2014", "totalCost" : 300, "avgQty" : 30, "count" : 1 } { "_id" : "05/12/2014", "totalCost" : 320, "avgQty" : 13.333333333333334, "count" : 3 } { "_id" : "07/02/2014", "totalCost" : 200, "avgQty" : 25, "count" : 1 } { "_id" : "02/02/2014", "totalCost" : 400, "avgQty" : 20, "count" : 2 }
Ở đây từ kết quả cho thấy rằng, tài liệu cho trường ngày lập hóa đơn đã được nhóm lại và hiển thị tổng chi phí, số lượng trung bình và số lượng hóa đơn được thực hiện cho ngày đó
Ví dụ-2. $group trên nhiều khóa
Ví dụ sau nhóm theo ngày lập hóa đơn, sau đó theo trường mục và hiển thị tổng chi phí, số lượng trung bình và số lượng hóa đơn trong cùng một ngày
db.invoice.aggregate[
[
{
$group : {_id : {inv_date : "$inv_date",item : "$item"},
totalCost: { $sum: { $multiply: [ "$rate", "$qty" ] } },
avgQty: { $avg: "$qty" },
count: { $sum: 1 }
}
}
]
].pretty[];
đầu ra
{ "_id" : { "inv_date" : "17/12/2014", "item" : "mks" }, "totalCost" : 200, "avgQty" : 10, "count" : 1 } { "_id" : { "inv_date" : "13/04/2014", "item" : "doz" }, "totalCost" : 300, "avgQty" : 30, "count" : 1 } { "_id" : { "inv_date" : "05/12/2014", "item" : "amp" }, "totalCost" : 80, "avgQty" : 10, "count" : 1 } { "_id" : { "inv_date" : "07/02/2014", "item" : "amp" }, "totalCost" : 200, "avgQty" : 25, "count" : 1 } { "_id" : { "inv_date" : "05/12/2014", "item" : "sam" }, "totalCost" : 240, "avgQty" : 15, "count" : 2 } { "_id" : { "inv_date" : "02/02/2014", "item" : "doz" }, "totalCost" : 400, "avgQty" : 20, "count" : 2 }
Từ kết quả trên cho thấy, chứng từ của hóa đơn ngày 12/05/2014 và ngày 02/02/2014 có cùng một mặt hàng, hai trường này gộp lại tạo thành một nhóm
Ví dụ-3. $group trên nhiều khóa với $match
Ví dụ sau nhóm theo ngày lập hóa đơn, sau đó theo trường mục và hiển thị tổng chi phí, số lượng trung bình và số lượng hóa đơn trong cùng một ngày đối với những chứng từ có ngày lập hóa đơn là 12/05/2014
db.invoice.aggregate[
[
{
$match : {inv_date : "05/12/2014"}
},
{
$group : {_id : {inv_date : "$inv_date",item : "$item"},
totalCost: { $sum: { $multiply: [ "$rate", "$qty" ] } },
avgQty: { $avg: "$qty" },
count: { $sum: 1 }
}
}
]
].pretty[];
đầu ra
{ "_id" : { "inv_date" : "05/12/2014", "item" : "amp" }, "totalCost" : 80, "avgQty" : 10, "count" : 1 } { "_id" : { "inv_date" : "05/12/2014", "item" : "sam" }, "totalCost" : 240, "avgQty" : 15, "count" : 2 }
Từ kết quả trên cho thấy, chứng từ lập hóa đơn ngày 12/05/2014 có 3 hóa đơn nhưng cùng một tổ hợp mặt hàng đã tạo thành một nhóm
Ví dụ-4. $group giá trị riêng biệt
Thao tác tổng hợp sau đây sử dụng giai đoạn $group để nhóm ngày lập hóa đơn của các tài liệu theo mục