MongoDB - Tổng hợp
Hoạt động tổng hợp xử lý hồ sơ dữ liệu và trả về kết quả đã tính toán. Thao tác tổng hợp nhóm các giá trị từ nhiều tài liệu lại với nhau và có thể thực hiện nhiều thao tác trên dữ liệu được nhóm để trả về một kết quả duy nhất. Trong SQL count (*) và với nhóm by là tương đương với tổng hợp MongoDB.
Phương thức tổng hợp ()
Để tổng hợp trong MongoDB, bạn nên sử dụng aggregate() phương pháp.
Cú pháp
Cú pháp cơ bản của aggregate() phương pháp như sau:
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Thí dụ
Trong bộ sưu tập, bạn có dữ liệu sau:
{
_id: ObjectId(7df78ad8902c)
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
_id: ObjectId(7df78ad8902d)
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 10
},
{
_id: ObjectId(7df78ad8902e)
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Neo4j',
url: 'http://www.neo4j.com',
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
},
Bây giờ từ bộ sưu tập ở trên, nếu bạn muốn hiển thị một danh sách cho biết có bao nhiêu hướng dẫn được viết bởi mỗi người dùng, thì bạn sẽ sử dụng như sau aggregate() phương pháp -
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{ "_id" : "tutorials point", "num_tutorial" : 2 }
{ "_id" : "Neo4j", "num_tutorial" : 1 }
>
Truy vấn tương đương Sql cho trường hợp sử dụng trên sẽ là select by_user, count(*) from mycol group by by_user.
Trong ví dụ trên, chúng tôi đã nhóm các tài liệu theo trường by_uservà trên mỗi lần xuất hiện của người dùng, giá trị tổng trước đó được tăng lên. Sau đây là danh sách các biểu thức tổng hợp có sẵn.
Biểu hiện | Sự miêu tả | Thí dụ |
---|---|---|
$ sum | Tính tổng giá trị đã xác định từ tất cả các tài liệu trong bộ sưu tập. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ sum: "$ likes"}}}]) |
$ trung bình | Tính giá trị trung bình của tất cả các giá trị đã cho từ tất cả các tài liệu trong bộ sưu tập. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ avg: "$ likes"}}}]) |
$ min | Nhận giá trị tối thiểu tương ứng từ tất cả các tài liệu trong bộ sưu tập. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ min: "$ likes"}}}]) |
$ tối đa | Nhận tối đa các giá trị tương ứng từ tất cả các tài liệu trong bộ sưu tập. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ max: "$ likes"}}}]) |
$ push | Chèn giá trị vào một mảng trong tài liệu kết quả. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", url: {$ push: "$ url"}}}]) |
$ addToSet | Chèn giá trị vào một mảng trong tài liệu kết quả nhưng không tạo bản sao. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", url: {$ addToSet: "$ url"}}}]) |
$ đầu tiên | Lấy tài liệu đầu tiên từ các tài liệu nguồn theo cách phân nhóm. Thông thường, điều này chỉ có ý nghĩa cùng với một số -stage “$ sort” đã được áp dụng trước đó. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", first_url: {$ first: "$ url"}}}]) |
$ cuối cùng | Lấy tài liệu cuối cùng từ các tài liệu nguồn theo nhóm. Thông thường, điều này chỉ có ý nghĩa cùng với một số -stage “$ sort” đã được áp dụng trước đó. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", last_url: {$ last: "$ url"}}}]) |
Khái niệm đường ống
Trong lệnh UNIX, đường ống dẫn có nghĩa là khả năng thực hiện một thao tác trên một số đầu vào và sử dụng đầu ra làm đầu vào cho lệnh tiếp theo, v.v. MongoDB cũng hỗ trợ khái niệm tương tự trong khung tập hợp. Có một tập hợp các giai đoạn có thể xảy ra và mỗi giai đoạn đó được coi là một tập hợp tài liệu làm đầu vào và tạo ra một tập hợp tài liệu kết quả (hoặc tài liệu JSON kết quả cuối cùng ở cuối quy trình). Điều này sau đó có thể được sử dụng cho giai đoạn tiếp theo, v.v.
Sau đây là các giai đoạn có thể có trong khuôn khổ tổng hợp -
$project - Được sử dụng để chọn một số trường cụ thể từ một tập hợp.
$match - Đây là một hoạt động lọc và do đó, điều này có thể làm giảm số lượng tài liệu được cung cấp làm đầu vào cho giai đoạn tiếp theo.
$group - Điều này thực hiện tổng hợp thực tế như đã thảo luận ở trên.
$sort - Sắp xếp các tài liệu.
$skip - Với điều này, có thể bỏ qua chuyển tiếp trong danh sách tài liệu cho một lượng tài liệu nhất định.
$limit - Điều này giới hạn số lượng tài liệu cần xem, bởi số lượng nhất định bắt đầu từ các vị trí hiện tại.
$unwind- Điều này được sử dụng để giải phóng tài liệu đang sử dụng mảng. Khi sử dụng một mảng, dữ liệu là loại được nối trước và thao tác này sẽ được hoàn tác với thao tác này để có lại các tài liệu riêng lẻ. Như vậy với giai đoạn này chúng ta sẽ tăng lượng tài liệu cho giai đoạn tiếp theo.