Toán tử nhóm $ rất quan trọng trong MongoDB, vì nó giúp thực hiện các phép biến đổi dữ liệu khác nhau. Toán tử $group nhóm dữ liệu tương tự theo một số biểu thức đã chỉ định và nhóm tài liệu cho từng nhóm riêng biệt
Giả sử có 50 sinh viên trong cơ sở dữ liệu và tất cả họ đều yêu thích môn cricket. Nếu chúng ta muốn đếm tất cả các sinh viên yêu thích môn crickê, thì toán tử $group là một giải pháp hay cho nhiệm vụ đó
cú pháp
Điểm quan trọng
- _Tôi. Trường này là bắt buộc để nhóm. Nếu bạn chỉ định giá trị của trường _id là null hoặc một hằng số, toán tử $group sẽ tính toàn bộ các giá trị tích lũy cho tất cả các tài liệu đầu vào
- đồng ruộng. Đây là trường tùy chọn và được tính bằng toán tử
ví dụ
Trong các ví dụ sau, chúng tôi đang làm việc với
{ "_id" : A1, "item_name" : "Blue box", "price" : 10, "qty" : 15, "date_of_bill" : "13/04/2015" } { "_id" : A2, "item_name" : "Light Red box", "price" : 15, "qty" : 20, "date_of_bill" : "05/12/2014" } { "_id" : null, "item_name" : "Green box", "price" : 10, "qty" : 30, "date_of_bill" : "17/12/2014" } { "_id" : A3, "item_name" : "White box", "price" : 8, "qty" : 25, "date_of_bill" : "07/02/2014" } { "_id" : A4, "item_name" : "Blue box", "price" : 15, "qty" : 20, "date_of_bill" : "13/04/2015" } { "_id" : A5, "item_name" : "Red box", "price" : 12, "qty" : 10, "date_of_bill" : "05/12/2014" } { "_id" : A6, "item_name" : "Black box", "price" : 10, "qty" : 30, "date_of_bill" : "22/04/2020" } { "_id" : A7, "item_name" : "Red box", "price" : 8, "qty" : 15, "date_of_bill" : "05/12/2014" } { "_id" : A8, "item_name" : "Green box", "price" : 20, "qty" : 10, "date_of_bill" : "17/12/2014" } { "_id" : A9, "item_name" : "Green box", "price" : 10, "qty" : 30, "date_of_bill" : "17/12/2014" }
ví dụ 1. nhóm $
Trong ví dụ này, chúng tôi sẽ nhóm theo các trường Ngày lập hóa đơn và Tên mặt hàng và hiển thị các trường này [Tổng giá, Số lượng trung bình và Đếm số hóa đơn trong cùng một ngày] cho các chứng từ có ngày lập hóa đơn là 12/05/2014
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
________số 8Từ 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