Tìm hiểu cơ bản về Aggregation trong Mongodb

I. Tổng Quan

1. Giới thiệu

Aggregation thường được sử dụng để tổng hợp dữ liệu. Nó cho phép ta thực hiện tìm kiếm, nhóm, sắp xếp và xử lý các phép tính toán phức tạp… Có 4 mục chính chúng ta cần biết là: options, pipeline, stages, operator

– Options cung cấp cho ta khả năng tùy chỉnh thêm khi chúng ta thực hiện Aggregation

– Pipeline ta có thể hiểu là các bước công việc sẽ được thực hiện tuần tự để hoàn thành một mục tiêu cụ thể

– Stages là 1 bước công việc trong Pipeline. Công việc có thể là tìm kiếm, sắp xếp, thêm field, tính toán…

– Operator là các toán tử dùng để tìm kiếm hoặc thay đổi dữ liệu bên trong 1 Stages

2. Nguyên tắc hoạt động

Bạn có thể hiểu nguyên tắc hoạt động của Aggregation như sau:

Như trên hình ảnh bạn có thể thấy:

Đầu tiên chúng ta có INPUT là COLLECTION muốn Aggregation

Đi vào STEP 1 với INPUT đầu vào là COLLECTION ta xử lý tìm kiếm DATE bằng 2024-01-01 và có OUTPUT như hình ảnh

Đi vào STEP 2 với INPUT đầu vào là OUTPUT của STEP 1 ta xử lý tìm kiếm HOUR bằng 4 và có OUTPUT như hình ảnh

Cứ như vậy cho đến khi hoàn thành tất cả các bước chúng sẽ ra được OUTPUT.

II. Nội dung

1. Cú pháp

Ok giờ cùng tìm hiều cú pháp nào, dưới đây là cú pháp và mô tả ngắn:

db.COLLECTION.aggregate(PIPELINEOPTIONS)

– COLLECTION: Là tên collection

– PIPELINE: Là một chuỗi các hoạt động tổng hợp dữ liệu

– OPTIONS: Là các tùy chọn bổ sung(Nó không bắt buộc)

2. Các options cơ bản

– allowDiskUse: Dùng khi bộ nhớ không đủ và cho phép sử dụng ổ đĩa để lưu dữ liệu

– maxTimeMS: Dùng để xác định thời gian tối đa query thực thi

– explain: Dùng để phân tích tối ưu query

3. Các stages cơ bản

– $match: Dùng để tìm kiếm document

– $count: Dùng để đếm document

– $group: Dùng để nhóm document

– $skip: Dùng để chỉ định số document bị bỏ qua tính từ document đầu tiên

– $limit: Dùng để chỉ định số lượng document cần lấy ra tính từ document đầu tiên

– $sort: Dùng để sắp xếp document

– $project: Thường dùng để cập nhật hoặc chỉ định các field sẽ xuất hiện trong đầu ra của document

– $addFields: Dùng để thêm field vào document

– $unset: Dùng để loại bỏ các field chỉ định trong đầu ra của document

Các bạn có thể truy cập vào link bên dưới để tìm hiểu thêm các Stages khác
https://www.mongodb.com/docs/manual/reference/operator/aggregation-pipeline

4. Các Operator cơ bản

– $eq: Dùng để so sánh 2 giá trị (TRUE: tương đương, FALSE: không tương đương)

– $ne: Dùng để so sánh 2 giá trị (TRUE: không tương đương, FALSE: tương đương)

– $add: Cộng các số hoặc các ngày lại với nhau

– $subtract: Trừ hai số số hoặc 2 ngày với nhau (Trường hợp nhiều hơn 2 số ta có thể tính toán trước như sử dụng $add sau đó mới trừ)

– $divide: Dùng để chia 1 số cho 1 số khác

– $multiply: Dùng để nhân các số lại với nhau

– $sum: Thường được dùng để tính tổng trong khi thao tác với $group hoặc tính tổng 1 số field trong $project

Các bạn có thể truy cập vào link bên dưới để tìm hiểu thêm các Operator khác có rất nhiều Oparetor về toán học, thao tác chuỗi, thời gian…

https://www.mongodb.com/docs/manual/reference/operator/aggregation

5. Ví dụ

Ví dụ mình có 1 collection với tên là “conversions” trong conversion mình có 1 vài field với dữ liệu như sau:

Bài toán yêu cầu thống kê tổng số tiền payout theo giờ vào ngày 2024-01-01 (Lưu ý payout = payout_pending + payout_approved)

db.CONVERSIONS.aggregate([
    {
        //Lọc document có date = 2024-01-01
	$match: { "date": "2024-01-01"}
    },
    {
        //Nhóm dữ liệu theo giờ
	$group: {
	    _id: "$hour",

            //Tổng payout theo giờ
	    payout: {
	        $sum: {
                    //Tính payout của từng document
	            $add: ["$payout_pending", "$payout_approved"]
                }
            }

        }
    }
]);

III. Kết luận

Trong bài này mình đã giới thiệu cơ bản về Aggregation trong mongodb. Trường hợp các bạn muốn tối ưu truy vấn “Aggregation Pipeline” các bạn có thể truy cập vào link bên dưới nha

https://www.mongodb.com/docs/v7.0/core/aggregation-pipeline-optimization/#aggregation-pipeline-optimization

Cảm ơn các bạn đã đọc!

Related Posts