Toán tử $ group 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 cụ thể và nhóm tài liệu cho từng nhóm riêng biệt.
Giả sử có 50 sinh viên trong một 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 cricket, thì toán tử $ group là một giải pháp hữu ích cho một nhiệm vụ như vậy.
Cú pháp:
{ $group: { _id: <expression>, // Group By Expression <field1>: { <accumulator1> : <expression1> }, ... } }
Điểm quan trọng:
- _id: 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ẽ đếm tổng thể các giá trị tích lũy cho tất cả các tài liệu đầu vào.
- Field: Đây là trường tùy chọn và được tính bằng các toán tử <accumulator>.
Ví dụ:
Trong các ví dụ sau, chúng tôi đang làm việc với:
- Cơ sở dữ liệu: testDB
- Collection: hóa đơn
Document: Mười tài liệu chứa các chi tiết của bill
{ "_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: $ group
Trong ví dụ này, chúng tôi sẽ nhóm theo ngày lập bill và hiển thị các trường này (tổng giá, số lượng trung bình và đếm số lượng bill trong cùng một ngày).
db.invoice.aggregate( [ { $group : {_id : "$date_of_bill ", Total_price: { $sum: { $multiply: [ "$price", "$qty" ] } }, Average_qty: { $avg: "$qty" }, count: { $sum: 1 } } } ] ).pretty();
Ở đây kết quả cho thấy rằng tài liệu ngày hóa đơn hiện trường được nhóm lại và hiển thị tổng giá, số lượng trung bình và số lượng hóa đơn được thực hiện cho ngày đó.
Ví dụ 2: Nhóm $ trên nhiều khóa
Trong ví dụ này, chúng tôi sẽ nhóm theo ngày bill và trường 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ố lượng hóa đơn trong cùng một ngày).
db.invoice.aggregate( [ { $group : {_id : { date_of_bill : "$date_of_bill ", item : "$item_name" Total_price: { $sum: { $multiply: [ "$price", "$qty" ] } }, Average_qty: { $avg: "$qty" }, count: { $sum: 1 } } } ] ).pretty();
Ví dụ 3: Nhóm $ trên nhiều khóa với $ khớp
Trong ví dụ này, chúng tôi sẽ nhóm theo các trường Ngày 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ố lượng 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à 05/12/2014.
db.invoice.aggregate( [ { $match : { date_of_bill : "05/12/2014"} }, { $group : {_id : { date_of_bill : "$date_of_bill ", item : "$item_name" Total_price: { $sum: { $multiply: [ "$price", "$qty" ] } }, Average_qty: { $avg: "$qty" }, count: { $sum: 1 } } } ] ).pretty();