Lệnh tổng hợp (Aggregation) trong MongoDB là một công cụ mạnh mẽ cho phép xử lý dữ liệu và trả về kết quả tính toán từ các tập hợp dữ liệu phức tạp. Quy trình này bao gồm việc biến đổi giá trị từ nhiều tài liệu thành một tập hợp dữ liệu tóm tắt, thông qua một loạt các hoạt động như nhóm hóa, sắp xếp, và tính toán tổng hợp. Tầm quan trọng của lệnh tổng hợp trong MongoDB không chỉ nằm ở khả năng tối ưu hóa và tổ chức dữ liệu mà còn giúp phát hiện ra những hiểu biết sâu sắc và giá trị từ dữ liệu, mở ra cơ hội cho việc phân tích dữ liệu chuyên sâu và hỗ trợ ra quyết định dựa trên dữ liệu. Với lệnh tổng hợp, người dùng có thể thực hiện các truy vấn phức tạp, từ việc đơn giản như đếm số lượng tài liệu đến các nhiệm vụ phức tạp hơn như xây dựng các báo cáo tổng hợp và thống kê. Điều này làm cho lệnh tổng hợp trở thành một phần không thể thiếu trong công việc quản lý và phân tích dữ liệu hiện đại, giúp tăng cường hiệu quả và sức mạnh của các ứng dụng sử dụng MongoDB.
Quá trình tổng hợp dữ liệu trong MongoDB
Quá trình tổng hợp dữ liệu trong MongoDB là một phương pháp mạnh mẽ để biến đổi và kết hợp dữ liệu từ nhiều tài liệu thành một tập hợp dữ liệu tóm tắt hoặc phức tạp, thông qua một loạt các hoạt động xử lý dữ liệu. Các trường hợp sử dụng cụ thể cho lệnh tổng hợp bao gồm việc nhóm hóa dữ liệu theo các trường nhất định, tính toán các giá trị tổng hợp như tổng, trung bình, hoặc max/min, và tạo ra các dạng dữ liệu mới từ dữ liệu hiện có. Ví dụ, trong một ứng dụng thương mại điện tử, tổng hợp có thể được sử dụng để tính toán doanh số bán hàng tổng cộng, số lượng sản phẩm bán được theo từng danh mục, hoặc để xây dựng các bảng xếp hạng sản phẩm dựa trên đánh giá của khách hàng.
So với các truy vấn truyền thống, lệnh tổng hợp mang lại lợi ích đáng kể về khả năng xử lý và phân tích dữ liệu phức tạp mà không cần phải rời khỏi cơ sở dữ liệu. Cách tiếp cận này không chỉ giảm thiểu sự cần thiết phải xử lý sau truy vấn trong ứng dụng hoặc dịch vụ phía server, mà còn tối ưu hóa hiệu suất bằng cách giảm bớt lượng dữ liệu cần phải truyền đi và tận dụng tối đa khả năng xử lý của MongoDB. Hơn nữa, tổng hợp cung cấp một framework linh hoạt và mạnh mẽ, cho phép xây dựng các truy vấn phức tạp và đa dạng, từ đơn giản đến cực kỳ tinh vi, đáp ứng nhu cầu ngày càng cao về phân tích dữ liệu trong thế giới dữ liệu lớn ngày nay.
Pipeline Tổng Hợp
Trong MongoDB, pipeline tổng hợp là một khái niệm trung tâm trong quá trình tổng hợp dữ liệu, cho phép xây dựng một chuỗi các bước xử lý dữ liệu được thực hiện tuần tự. Mỗi bước trong pipeline đại diện cho một hoạt động tổng hợp cụ thể, như lọc, nhóm hóa, sắp xếp, hoặc tính toán các giá trị tổng hợp. Các bước này được thực hiện một cách tuần tự, với đầu ra của mỗi bước trở thành đầu vào cho bước tiếp theo, cho phép xử lý dữ liệu phức tạp và mạnh mẽ.
Để xây dựng một pipeline tổng hợp, bước đầu tiên thường là lọc dữ liệu sử dụng toán tử $match
, loại bỏ những tài liệu không cần thiết từ tập kết quả. Tiếp theo, có thể sử dụng $group
để nhóm dữ liệu theo một hoặc nhiều trường và áp dụng các hàm tổng hợp như $sum
, $avg
, hoặc $max
. Sau đó, $sort
có thể được dùng để sắp xếp dữ liệu, và $project
để chọn hoặc biến đổi các trường dữ liệu trong tài liệu kết quả. Cuối cùng, $limit
và $skip
có thể được áp dụng để phân trang kết quả.
Một ví dụ đơn giản về pipeline tổng hợp có thể bao gồm các bước như sau:
$match
để lọc dữ liệu.$group
để nhóm tài liệu theo trường cụ thể và tính toán tổng số.$sort
để sắp xếp kết quả.$limit
để giới hạn số lượng tài liệu trả về.
Pipeline tổng hợp mang lại sự linh hoạt và mạnh mẽ cho việc xử lý và phân tích dữ liệu trong MongoDB, cho phép người dùng xây dựng các truy vấn phức tạp và đa dạng, đáp ứng nhu cầu ngày càng cao về thông tin và hiểu biết từ dữ liệu.
Cú pháp của một truy vấn tổng hợp trong MongoDB
{ aggregate: "<collection>" || 1, pipeline: [ <stage>, <...>], explain: <boolean>, allowDiskUse: <boolean>, cursor: <doc>, maxTimeMS: <int>, bypassDocumentValidation: <boolean>, readConcern: <doc>, collation: <doc>, hint: <string or doc>, comment: <string>, writeConcern: <doc> }
Lệnh bạn đề cập đến là cú pháp của một truy vấn tổng hợp trong MongoDB, nơi bạn có thể xác định một loạt các tham số để tinh chỉnh cách truy vấn được thực thi và kết quả được xử lý. Dưới đây là giải thích chi tiết về mỗi thành phần trong lệnh:
aggregate
: Tên của collection bạn muốn thực hiện truy vấn tổng hợp, hoặc1
để chỉ định một truy vấn tổng hợp trên cùng một collection.pipeline
: Một mảng các “stage”, mỗi stage đại diện cho một bước xử lý trong quy trình tổng hợp. Mỗi stage có thể sử dụng các toán tử tổng hợp như$match
,$group
,$sort
, v.v., để biến đổi và xử lý dữ liệu.explain
: Một giá trị boolean (true
hoặcfalse
). Khi được thiết lập làtrue
, MongoDB sẽ trả về thông tin giải thích về cách thức thực thi truy vấn thay vì kết quả truy vấn thực sự. Điều này hữu ích cho việc phân tích và tối ưu hóa truy vấn.allowDiskUse
: Một giá trị boolean cho phép các hoạt động tổng hợp sử dụng bộ nhớ đĩa để lưu trữ dữ liệu tạm thời nếu cần thiết. Điều này có thể giúp xử lý các truy vấn lớn mà không đủ bộ nhớ RAM.cursor
: Định nghĩa cách thức dữ liệu được trả về. Ví dụ, bạn có thể chỉ định kích thước batch cho con trỏ để kiểm soát số lượng tài liệu được trả về trong mỗi lần tải.maxTimeMS
: Thiết lập thời gian tối đa (tính bằng mili giây) mà truy vấn được phép thực thi, giúp ngăn chặn các truy vấn chạy quá lâu.bypassDocumentValidation
: Khi được thiết lập làtrue
, cho phép truy vấn tổng hợp bỏ qua bất kỳ quy tắc xác thực tài liệu nào đã được thiết lập cho collection.readConcern
: Xác định mức độ đảm bảo độ tin cậy cho dữ liệu đọc, ví dụ như đọc dữ liệu đã được đa số các node trong Replica Set xác nhận.collation
: Cho phép bạn chỉ định các quy tắc sắp xếp dữ liệu dựa trên ngôn ngữ cụ thể, hữu ích trong việc so sánh chuỗi trong nhiều ngôn ngữ khác nhau.hint
: Cung cấp “gợi ý” về chỉ mục nào nên được sử dụng khi thực hiện truy vấn.comment
: Thêm một nhận xét vào truy vấn, giúp ghi chú hoặc mô tả truy vấn cho mục đích phân tích hoặc gỡ lỗi.writeConcern
: Xác định mức độ đảm bảo độ tin cậy cho việc ghi dữ liệu, ví dụ như yêu cầu xác nhận ghi từ một số node nhất định trong Replica Set.
Lệnh tổng hợp này cung cấp một khung làm việc mạnh mẽ và linh hoạt cho việc xử lý và phân tích dữ liệu trong MongoDB, cho phép bạn điều chỉnh truy vấn một cách tinh tế để đáp ứng nhu cầu cụ thể của ứng dụng hoặc phân tích dữ liệu.
Ví dụ:
Chúng tôi có các tài liệu sau trong bài viết:
{ _id: ObjectId("52769ea0f3dc6ead47c9a1b2"), author: "Ankit", title: "Course", tags: [ "Java Tutorial", "DBMS Tutorial", "mongodb"] }
Bây giờ, chúng tôi sẽ thực hiện một hoạt động tổng hợp trên bộ sưu tập bài viết để tính toán số lượng của mọi phần tử riêng biệt trong mảng thẻ xuất hiện trong bộ sưu tập.
db.runCommand( { aggregate: "articles", pipeline: [ { $project: { tags: 1 } }, { $unwind: "$tags" }, { $group: { _id: "$tags", count: { $sum : 1 } } } ], cursor: { } } )
Lệnh MongoDB Count
Lệnh MongoDB đếm số lượng tài liệu trong một bộ sưu tập hoặc một dạng xem. Nó trả về một tài liệu có chứa trạng thái đếm và lệnh.
Cú pháp:
{ count: <collection or view>, query: <document>, limit: <integer>, skip: <integer>, hint: <hint>, readConcern: <document>, collation: <document> }
Field | Type | Description |
count | string | Đây là tên của collection hoặc view cần đếm. |
query | document | Nó là tùy chọn và được sử dụng để chọn tài liệu để đếm trong bộ sưu tập hoặc chế độ xem. |
limit | integer | Nó là tùy chọn và được sử dụng để giới hạn số lượng tối đa các tài liệu phù hợp để trả về. |
skip | integer | Nó là tùy chọn và được sử dụng để so khớp các tài liệu cần bỏ qua trước khi trả về kết quả. |
hint | string | Nó được sử dụng để xác định tên chỉ mục dưới dạng một chuỗi hoặc tài liệu đặc tả chỉ mục. |
readConcern document | readConcern: { level: <value> } | |
collation | document | Nó cho phép chúng ta xác định các quy tắc ngôn ngữ cụ thể để so sánh chuỗi. collation: { locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> } |
Ví dụ:
Để đếm số lượng tất cả các tài liệu trong collection:
db.runCommand ({count: 'order'})
Lệnh Distinct của MongoDB
Lệnh này tìm các giá trị riêng biệt cho trường đã cho trên một tập hợp duy nhất. Nó trả về một tài liệu có chứa một mảng các giá trị khác nhau. Tài liệu trả về chứa một bản ghi được nhúng với thống kê truy vấn và kế hoạch truy vấn.
Cú pháp:
distinct: "<collection>", key: "<field>", query: <query>, readConcern: <read concern document>, collation: <collation document> }
Field | Type | Description |
distinct | string | Nó là tên của collection để truy vấn các giá trị khác nhau |
key | document | Đây là trường mà lệnh trả về giá trị khác biệt. |
query | integer | Nó chỉ định các tài liệu từ nơi giá trị khác biệt sẽ được truy xuất. |
readConcern document | Nó chỉ định mối quan tâm đọc. readConcern: { level: <value> } | |
collation | string | Nó cho phép chúng tôi xác định các quy tắc dành riêng cho ngôn ngữ để so sánh chuỗi. collation: { locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> } |
Ví dụ:
Ví dụ sau trả về các giá trị khác nhau cho các sách trường từ tất cả các tài liệu trong bộ sưu tập thư viện:
db.runCommand ( { distinct: "library", key: "books" } )
Lệnh MongoDB MapReduce
Lệnh MapReduce cho phép chúng tôi chạy các hoạt động tổng hợp thu nhỏ bản đồ trên một tập hợp.
Cú pháp:
db.runCommand( { mapReduce: <collection>, map: <function>, reduce: <function>, finalize: <function>, out: <output>, query: <document>, sort: <document>, limit: <number>, scope: <document>, jsMode: <boolean>, verbose: <boolean>, bypassDocumentValidation: <boolean>, collation: <document>, writeConcern: <document> } )
Field | Type | Description |
MapReduce | collection | Đây là tên của tập hợp mà chúng ta muốn thực hiện thao tác mapReduce. |
map | function | Đây là một hàm JavaScript liên kết hoặc ánh xạ cặp khóa-giá trị. |
reduce | function | Đây là một hàm JavaScript giúp giảm xuống một đối tượng duy nhất tất cả các giá trị được liên kết với một khóa cụ thể. |
out | string | Nó chỉ định nơi lưu trữ đầu ra. |
query | document | Nó chỉ định các tiêu chí lựa chọn để xác định các tài liệu đầu vào cho map function. |
sort | document | Nó sắp xếp tài liệu đầu vào. |
limit | number | Nó chỉ định số lượng tài liệu tối đa cho đầu vào vào map function. |
finalize | function | Nó tuân theo phương pháp giảm để sửa đổi đầu ra. |
scope | document | Nó là một tùy chọn và khai báo các biến toàn cục có thể truy cập được trên map. |
jsMode | boolean | jsMode chỉ định có chuyển đổi dữ liệu trung gian sang định dạng BSON hay không. |
verbose | boolean | Nó chỉ định có đưa thông tin thời gian vào kết quả hay không. |
bypass Document Validation | boolean | Nó cho phép mapReduce để bỏ qua xác thực tài liệu trong quá trình hoạt động. |
collation | document | Nó cho phép chúng tôi chỉ định các quy tắc dành riêng cho ngôn ngữ để so sánh chuỗi collation: { locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> } |
writeConcern | document | Đây là một tài liệu thể hiện mối quan tâm ghi được sử dụng khi xuất ra một collection. |
Ví dụ:
var mapFunction = function() { ... }; var reduceFunction = function(key, values) { ... }; db.runCommand( { mapReduce: <input-collection>, map: mapFunction, reduce: reduceFunction, out: { merge: <output-collection> }, query: <query> } )
Một số toán tử tổng hợp khác
Trong quá trình tổng hợp dữ liệu MongoDB, một số toán tử tổng hợp chính đóng vai trò cốt lõi, giúp xử lý và biến đổi dữ liệu một cách linh hoạt và hiệu quả.
$match
: Toán tử này được sử dụng để lọc dữ liệu, tương tự như cáchfind()
hoạt động. Nó chỉ giữ lại những tài liệu phù hợp với điều kiện đã cho.
Ví dụ:
db.collection.aggregate([{$match: {age: {$gt: 30}}}])
Đoạn code này sẽ lọc và chỉ giữ lại những tài liệu có trường age
lớn hơn 30.
$group
: Toán tử này nhóm các tài liệu theo một trường hoặc biểu thức nhất định và thực hiện các hàm tổng hợp trên mỗi nhóm.
Ví dụ:
db.collection.aggregate([{$group: {_id: "$category", total: {$sum: 1}}}])
Đoạn này nhóm các tài liệu theo category
và tính tổng số tài liệu trong mỗi nhóm.
$sort
: Sắp xếp các tài liệu trong kết quả tổng hợp theo một hoặc nhiều trường.
Ví dụ:
db.collection.aggregate([{$sort: {age: -1}}])
Sắp xếp các tài liệu giảm dần theo trường age
.
$limit
: Giới hạn số lượng tài liệu trả về.
Ví dụ:
db.collection.aggregate([{$limit: 5}])
Giới hạn kết quả truy vấn chỉ trả về 5 tài liệu đầu tiên.
$project
: Chọn hoặc loại bỏ trường, có thể được sử dụng để thêm, loại bỏ, hoặc tính toán giá trị mới.
Ví dụ:
db.collection.aggregate([{$project: {name: 1, age: 1}}])
Trong ví dụ này, $project
được sử dụng để chỉ giữ lại trường name
và age
trong mỗi tài liệu kết quả.
Các toán tử tổng hợp này, khi được kết hợp trong một pipeline tổng hợp, cho phép thực hiện các truy vấn phức tạp và biến đổi dữ liệu một cách mạnh mẽ, từ việc lọc và nhóm dữ liệu đến sắp xếp và cấu trúc lại kết quả truy vấn, mở ra khả năng phân tích dữ liệu sâu sắc và tạo ra thông tin giá trị từ tập dữ liệu lớn.