Số lượng tổng hợp của Golang MongoDB
Tôi đến từ NodeJS và đó là Mongoose ORM cho Mongodb, có phương thức Populate tiện dụng. Một phương thức như vậy không tồn tại với MongoDB Go Driver. Tôi đã đạt được một kết quả giống như phép nối tương tự bằng cách sử dụng phương thức MongoDB Aggregate, phương pháp này dẫn các hoạt động Show Trong ví dụ này, tôi chứng minh một đường ống Tổng hợp sắp xếp theo trình tự sau
Trình tự này xử lý tìm kiếm, sắp xếp và phân trang trước khi điền vào trường mối quan hệ cấu trúcTrường parent_id không được hiển thị trên phản hồi JSON, thay vào đó, trường mẹ đã điền được hiển thị
Hàm sốHàm này chạy trên cấu trúc Con, tham chiếu cấu trúc Cha theo ID. Nó nhận một số tham số truy vấn để tìm kiếm và phân trang và trả về dữ liệu, cùng với số lượng tài liệu phù hợp với tiêu chí đã cho
số ítChức năng trên có thể được sử dụng để thay thế 'Tìm', nhưng đối với 'FindOne', việc sắp xếp lại con trỏ cần phải là một số ít, thay vì một lát cắt Khi bạn bắt đầu làm việc với MongoDB, thông thường bạn sẽ sử dụng lệnh use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])4 cho nhiều loại truy vấn. Tuy nhiên, ngay khi các truy vấn của bạn nâng cao hơn, bạn sẽ cần biết thêm về tập hợp MongoDB Trong bài viết này, tôi sẽ giải thích các nguyên tắc chính của việc xây dựng các truy vấn tổng hợp trong MongoDB và cách tận dụng các chỉ mục để tăng tốc chúng Hơn nữa, tôi sẽ giới thiệu các giai đoạn quan trọng nhất của quy trình tổng hợp với các ví dụ ngắn sử dụng từng giai đoạn và cách áp dụng chúng vào quy trình Tập hợp là một cách xử lý một số lượng lớn tài liệu trong một bộ sưu tập bằng cách chuyển chúng qua các giai đoạn khác nhau. Các giai đoạn tạo nên cái được gọi là đường ống dẫn. Các giai đoạn trong quy trình có thể lọc, sắp xếp, nhóm, định hình lại và sửa đổi các tài liệu đi qua quy trình Một trong những trường hợp sử dụng phổ biến nhất của Tổng hợp là tính toán các giá trị tổng hợp cho các nhóm tài liệu. Điều này tương tự như phép tổng hợp cơ bản có sẵn trong SQL với mệnh đề GROUP BY và các hàm COUNT, SUM và AVG. Mặc dù vậy, Tập hợp MongoDB còn tiến xa hơn và cũng có thể thực hiện các phép nối giống như quan hệ, định hình lại tài liệu, tạo mới và cập nhật các bộ sưu tập hiện có, v.v. Mặc dù có các phương pháp khác để lấy dữ liệu tổng hợp trong MongoDB, nhưng khung tổng hợp là phương pháp được đề xuất cho hầu hết công việc Có những phương pháp được gọi là phương pháp có mục đích duy nhất như use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])5, use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])6 và use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])7 được thêm vào truy vấn use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])4 để sử dụng nhanh chóng nhưng bị giới hạn về phạm vi Map-reduce framework trên MongoDB là tiền thân của aggregation framework và phức tạp hơn nhiều để sử dụng. MongoDB không còn được dùng nữa Đây là một sơ đồ để minh họa một đường dẫn tổng hợp MongoDB điển hình
Đầu vào của quy trình có thể là một bộ sưu tập duy nhất, trong đó các bộ sưu tập khác có thể được hợp nhất sau đó trong quy trình Sau đó, quy trình thực hiện các chuyển đổi liên tiếp trên dữ liệu cho đến khi đạt được mục tiêu của chúng tôi Bằng cách này, chúng tôi có thể chia một truy vấn phức tạp thành các giai đoạn dễ dàng hơn, trong mỗi giai đoạn đó chúng tôi hoàn thành một thao tác khác nhau trên dữ liệu. Vì vậy, khi kết thúc quy trình truy vấn, chúng tôi sẽ đạt được tất cả những gì chúng tôi muốn Cách tiếp cận này cho phép chúng tôi kiểm tra xem truy vấn của chúng tôi có hoạt động bình thường ở mọi giai đoạn hay không bằng cách kiểm tra cả đầu vào và đầu ra của nó. Đầu ra của mỗi giai đoạn sẽ là đầu vào của giai đoạn tiếp theo Các công cụ như Studio 3T cho phép bạn tạo truy vấn tổng hợp của mình Tải xuống Studio 3T miễn phí cho Mac, Windows hoặc Linux Không có giới hạn về số giai đoạn được sử dụng trong truy vấn hoặc cách chúng tôi kết hợp chúng Để đạt được hiệu suất truy vấn tối ưu, có một số phương pháp hay nhất cần tính đến. Chúng ta sẽ đến với những điều đó sau trong bài viết Đây là một ví dụ về cách tạo truy vấn tổng hợp { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }2,
Đây là một ví dụ về cú pháp đường ống tổng hợp 2Tổng hợp hoạt động trong bộ nhớ. Mỗi giai đoạn có thể sử dụng tối đa 100 MB RAM. Bạn sẽ gặp lỗi từ cơ sở dữ liệu nếu vượt quá giới hạn này Nếu nó trở thành một vấn đề không thể tránh khỏi, bạn có thể chọn chuyển trang sang đĩa, với nhược điểm duy nhất là bạn sẽ đợi lâu hơn một chút vì nó hoạt động chậm hơn trên đĩa hơn là trong bộ nhớ. Để chọn phương thức chuyển trang vào đĩa, bạn chỉ cần đặt tùy chọn { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }3 thành đúng như thế này 4Lưu ý rằng tùy chọn này không phải lúc nào cũng có sẵn các dịch vụ chia sẻ. Ví dụ: cụm Atlas M0, M2 và M5 tắt tùy chọn này Các tài liệu được trả về bởi truy vấn tổng hợp, dưới dạng con trỏ hoặc được lưu trữ qua { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }4 trong một bộ sưu tập khác, được giới hạn ở 16 MB. Nghĩa là, chúng không thể lớn hơn kích thước tối đa của tài liệu MongoDB Nếu bạn có khả năng vượt quá giới hạn này thì bạn nên chỉ định rằng đầu ra của truy vấn tổng hợp sẽ ở dạng con trỏ chứ không phải ở dạng tài liệu Tôi sẽ hiển thị các ví dụ tổng hợp MongoDB cho các giai đoạn đường ống quan trọng nhất Để minh họa cho các ví dụ, tôi sẽ sử dụng hai bộ sưu tập. Đầu tiên được gọi là { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }5 và được tạo thành từ các tài liệu này (dữ liệu không có thật) 7Nếu bạn muốn kiểm tra các ví dụ này trên bản cài đặt của riêng mình, bạn có thể chèn chúng bằng lệnh hàng loạt bên dưới hoặc use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ]) Bộ sưu tập thứ hai và cuối cùng được gọi là { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }6 và trông như thế này { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' } Một lần nữa, bạn có thể chèn chúng theo cách tương tự, sử dụng đoạn mã sau hoặc bằng cách nhập dưới dạng tệp JSON 1nơi bạn sẽ tìm thấy các tệp JSON có sẵn để tải xuống Giai đoạn use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])9 cho phép chúng tôi chỉ chọn những tài liệu đó từ bộ sưu tập mà chúng tôi muốn làm việc với. Nó thực hiện điều này bằng cách lọc ra những thứ không tuân theo yêu cầu của chúng tôi Trong ví dụ sau, chúng tôi chỉ muốn làm việc với những tài liệu chỉ định rằng { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }8 là giá trị của trường { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }9 và 10 là giá trị của trường 11Để có được kết quả có thể đọc được, tôi sẽ thêm 12 vào cuối tất cả các lệnh 8Đầu ra là… 9Rất hiếm khi bạn cần truy xuất tất cả các trường trong tài liệu của mình. Tốt nhất là chỉ trả lại những trường bạn cần để tránh xử lý nhiều dữ liệu hơn mức cần thiết Giai đoạn 13 được sử dụng để thực hiện việc này và để thêm bất kỳ trường tính toán nào mà bạn cầnTrong ví dụ này, chúng ta chỉ cần các trường { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }9, 11 và 16Trong đoạn mã sau, xin lưu ý rằng
Sân khấu này … use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])6 sẽ cho kết quả… use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])7 Đây là một ví dụ khác về MongoDB $project Với giai đoạn { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }0, chúng tôi có thể thực hiện tất cả các truy vấn tổng hợp hoặc tóm tắt mà chúng tôi cần, chẳng hạn như tìm số lượng, tổng số, trung bình hoặc tối đa Trong ví dụ này, chúng tôi muốn biết số lượng tài liệu cho mỗi trường đại học trong bộ sưu tập ‘ 80’ của chúng tôiTruy vấn… 40sẽ tạo ra kết quả này… 41Giai đoạn nhóm $ hỗ trợ các biểu thức (toán tử) nhất định cho phép người dùng thực hiện các phép toán số học, mảng, boolean và các hoạt động khác như một phần của quy trình tổng hợp OperatorMeaning$countTính toán số lượng tài liệu trong nhóm đã cho. $maxHiển thị giá trị tối đa của trường tài liệu trong bộ sưu tập. $minHiển thị giá trị tối thiểu của trường tài liệu trong bộ sưu tập. $avgHiển thị giá trị trung bình của trường tài liệu trong bộ sưu tập. $sumTổng hợp các giá trị được chỉ định của tất cả các tài liệu trong bộ sưu tập. $pushThêm các giá trị bổ sung vào mảng của tài liệu kết quảKiểm tra để xem các toán tử MongoDB khác và tìm hiểu thêm về chủ đề này Đây là một loại giai đoạn khác thường vì nó cho phép bạn chuyển các kết quả tổng hợp của mình sang một bộ sưu tập mới hoặc vào một bộ sưu tập hiện có sau khi loại bỏ nó hoặc thậm chí thêm chúng vào các tài liệu hiện có (mới trong 4. 1. 2 phiên bản) Giai đoạn { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }4 phải là giai đoạn cuối cùng trong quy trình Lần đầu tiên, chúng tôi đang sử dụng một tập hợp có nhiều giai đoạn. Bây giờ chúng tôi có hai, một { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }0 và một { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }4 42Bây giờ, chúng tôi kiểm tra nội dung của bộ sưu tập ' 84' mới 43Đây là cách chúng tôi sử dụng giai đoạn $out trong ví dụ ba phần này Bây giờ chúng tôi đã tạo ra một tập hợp nhiều giai đoạn, chúng tôi có thể tiếp tục xây dựng một đường dẫn Giai đoạn 85 trong MongoDB thường được tìm thấy trong một đường ống vì nó là phương tiện để kết thúcBạn không thể làm việc trực tiếp trên các phần tử của một mảng trong tài liệu có các giai đoạn như { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }0. Giai đoạn 85 cho phép chúng tôi làm việc với các giá trị của các trường trong một mảngKhi có trường mảng trong tài liệu đầu vào, đôi khi bạn sẽ cần xuất tài liệu nhiều lần, một lần cho mọi phần tử của mảng đó Mỗi bản sao của tài liệu có trường mảng được thay thế bằng phần tử kế tiếp Trong ví dụ tiếp theo, tôi sẽ chỉ áp dụng giai đoạn cho tài liệu có trường 16 chứa giá trị 89đây là tài liệu 44Bây giờ, chúng tôi áp dụng giai đoạn 85, trên mảng của sinh viên và kiểm tra xem chúng tôi có nhận được tài liệu cho mỗi phần tử của mảng khôngTài liệu đầu tiên được tạo thành từ các trường trong phần tử đầu tiên của mảng và phần còn lại của các trường chung Tài liệu thứ hai được tạo thành từ các trường trong phần tử thứ hai của mảng và phần còn lại của các trường chung, v.v. 45Bạn cần giai đoạn { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }1 để sắp xếp kết quả của mình theo giá trị của một trường cụ thể Ví dụ: hãy sắp xếp các tài liệu thu được từ giai đoạn 85 theo số lượng sinh viên theo thứ tự giảm dầnĐể có được kết quả thấp hơn, tôi sẽ chỉ dự đoán năm và số lượng sinh viên 46Điều này mang lại kết quả… 47Giai đoạn { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }1 có thể được sử dụng với các giai đoạn khác để giảm dữ liệu trong bộ sưu tập MongoDB xuống chính xác những gì bạn cần Nếu bạn chỉ quan tâm đến hai kết quả đầu tiên của truy vấn thì sao? 48Lưu ý rằng khi bạn cần giới hạn số lượng tài liệu được sắp xếp, bạn phải sử dụng giai đoạn 94 ngay sau giai đoạn { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }1 Bây giờ chúng tôi có một đường ống đầy đủ Chúng ta có thể dán toàn bộ truy vấn tổng hợp MongoDB này và tất cả các giai đoạn của nó vào thẳng Nó được dán vào bằng cách sao chép nó và nhấp vào nút dán mã như được hiển thị Đọc thêm về Trình chỉnh sửa tổng hợp, trình tạo truy vấn tổng hợp MongoDB theo từng giai đoạn của Studio 3T Chỉ phần hiển thị bên dưới được sao chép và dán vào 49Trong ảnh chụp màn hình tiếp theo, chúng ta có thể thấy toàn bộ quy trình trong Studio 3T và đầu ra của nó Xóa các giai đoạn trong Studio 3T là một vấn đề đơn giản bằng cách sử dụng nút được hiển thị trong ảnh chụp màn hình tiếp theo Trình chỉnh sửa tập hợp của Studio 3T hỗ trợ các giai đoạn và toán tử tập hợp MongoDB này Có thể bạn cần thực hiện một số thay đổi đối với đầu ra của mình theo cách của các trường mới. Trong ví dụ tiếp theo, chúng tôi muốn thêm năm thành lập trường đại học 70Điều này mang lại kết quả… 71Giai đoạn 96 cung cấp một cách dễ dàng để kiểm tra số lượng tài liệu thu được trong đầu ra của các giai đoạn trước của quy trìnhHãy xem nó hoạt động 72Điều này cung cấp tổng số những năm mà chúng tôi biết số lượng sinh viên tại trường Đại học 73Vì MongoDB dựa trên tài liệu nên chúng tôi có thể định hình tài liệu của mình theo cách chúng tôi cần. Tuy nhiên, thường có yêu cầu sử dụng thông tin từ nhiều bộ sưu tập Sử dụng 97, đây là một truy vấn tổng hợp hợp nhất các trường từ hai bộ sưu tập 74Cần một ví dụ khác về 97? Nếu bạn muốn truy vấn này chạy nhanh, bạn sẽ cần lập chỉ mục trường 16 trong bộ sưu tập 80 và trường use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])61 trong bộ sưu tập use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])62 Nói cách khác, đừng quên lập chỉ mục các trường liên quan đến 97 75Đây là cách nhanh nhất để Giai đoạn này là một lối tắt để nhóm, đếm và sau đó sắp xếp theo thứ tự giảm dần số lượng các giá trị khác nhau trong một trường Giả sử bạn muốn biết số lượng khóa học trên mỗi cấp độ, được sắp xếp theo thứ tự giảm dần. Sau đây là truy vấn bạn sẽ cần xây dựng 76Đây là đầu ra 77Đôi khi, khi tạo báo cáo về dữ liệu, bạn nhận thấy rằng mình cần thực hiện cùng một quá trình xử lý sơ bộ cho một số báo cáo và bạn phải đối mặt với việc phải tạo và duy trì bộ sưu tập trung gian Ví dụ: bạn có thể thực hiện tóm tắt giao dịch hàng tuần được sử dụng cho tất cả các báo cáo tiếp theo. Bạn có thể ước rằng có thể chạy đồng thời nhiều hơn một quy trình trên đầu ra của một quy trình tổng hợp duy nhất Bây giờ chúng tôi có thể làm điều đó trong một quy trình duy nhất nhờ giai đoạn use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])64 Hãy xem ví dụ này 78Những gì chúng tôi đã làm là tạo hai báo cáo từ cơ sở dữ liệu của chúng tôi về các khóa học đại học. ĐếmLevels và YearWithLessStudents Cả hai đều sử dụng đầu ra từ hai giai đoạn đầu tiên, use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])9 và 97Với một bộ sưu tập lớn, điều này có thể tiết kiệm rất nhiều thời gian xử lý bằng cách tránh lặp lại và chúng ta không cần phải viết một bộ sưu tập tạm thời trung gian nữa 79Đọc thêm về các trường hợp sử dụng khác của giai đoạn $facet trong tổng hợp MongoDB Bây giờ, hãy cố gắng tự mình giải quyết bài tập tiếp theo Làm thế nào để chúng ta có được tổng số sinh viên đã từng thuộc về từng trường đại học? use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])0 Đầu ra use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])1 Có, tôi đã kết hợp hai giai đoạn. Tuy nhiên, làm cách nào để tạo một truy vấn sắp xếp đầu ra theo trường use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])67 theo thứ tự giảm dần? use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])2 Phải, chúng ta cần áp dụng giai đoạn use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])68 ở đầu ra của use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])69 Tôi đã đề cập trước đó rằng rất dễ dàng và thực sự cần thiết để kiểm tra xem các giai đoạn truy vấn của chúng ta có đang thực hiện theo cách chúng ta cần chúng thực hiện không Với Studio 3T, bạn có hai bảng chuyên dụng để Đường dẫn tổng hợp tự động định hình lại truy vấn với mục đích cải thiện hiệu suất của nó Nếu bạn có cả hai giai đoạn { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }1 và use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])9, tốt hơn hết là sử dụng use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])9 trước { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }1 để giảm thiểu số lượng tài liệu mà giai đoạn { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }1 phải xử lý Để tận dụng các chỉ mục, bạn phải thực hiện điều đó trong giai đoạn đầu tiên của quy trình bán hàng. Và ở đây, bạn phải sử dụng các giai đoạn use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])9 hoặc { university : 'USAL', name : 'Computer Science', level : 'Excellent' } { university : 'USAL', name : 'Electronics', level : 'Intermediate' } { university : 'USAL', name : 'Communication', level : 'Excellent' }1 Chúng ta có thể kiểm tra xem truy vấn có đang sử dụng chỉ mục hay không thông qua phương thức use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])77 use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])3 Bạn luôn có thể xem kế hoạch use 3tdb db.universities.insert([ { country : 'Spain', city : 'Salamanca', name : 'USAL', location : { type : 'Point', coordinates : [ -5.6722512,17, 40.9607792 ] }, students : [ { year : 2014, number : 24774 }, { year : 2015, number : 23166 }, { year : 2016, number : 21913 }, { year : 2017, number : 21715 } ] }, { country : 'Spain', city : 'Salamanca', name : 'UPSA', location : { type : 'Point', coordinates : [ -5.6691191,17, 40.9631732 ] }, students : [ { year : 2014, number : 4788 }, { year : 2015, number : 4821 }, { year : 2016, number : 6550 }, { year : 2017, number : 6125 } ] } ])77 của bất kỳ truy vấn tổng hợp nào dưới dạng sơ đồ hoặc ở dạng JSON bằng cách nhấp vào tab Giải thích Tôi đã giới thiệu quy trình tổng hợp MongoDB và minh họa bằng các ví dụ về cách chỉ sử dụng một số giai đoạn Bạn càng sử dụng MongoDB nhiều, quy trình tổng hợp càng trở nên quan trọng hơn trong việc cho phép bạn thực hiện tất cả các tác vụ báo cáo, chuyển đổi và truy vấn nâng cao vốn không thể thiếu đối với công việc của nhà phát triển cơ sở dữ liệu Với các quy trình đường ống phức tạp hơn, việc kiểm tra và gỡ lỗi đầu vào và đầu ra của mọi giai đoạn ngày càng trở nên quan trọng. Luôn có một điểm mà tại đó người ta cần dán đường dẫn tổng hợp đang phát triển vào IDE cho MongoDB, chẳng hạn như Studio 3T, với Trình chỉnh sửa tổng hợp tích hợp sẵn, để bạn có thể gỡ lỗi mọi giai đoạn một cách độc lập Làm cách nào để có được số lượng kết quả tổng hợp trong MongoDB?The giai đoạn $count trả về số lượng tài liệu còn lại trong quy trình tổng hợp và gán giá trị cho trường có tên là pass_scores.
Chúng ta có thể sử dụng tính năng đếm với hàm tổng hợp trong MongoDB không?MongoDB $count Aggregation
. Có một số điều quan trọng cần lưu ý về cú pháp này. Đầu tiên, chúng tôi gọi toán tử $count và sau đó chỉ định chuỗi. The MongoDB $count operator allows us to pass a document to the next phase of the aggregation pipeline that contains a count of the documents. There a couple of important things to note about this syntax: First, we invoke the $count operator and then specify the string.
Làm cách nào để có được tổng số trong MongoDB?count() được sử dụng để trả về số lượng tài liệu khớp với truy vấn find(). db. thu thập. Phương thức đếm () không thực hiện thao tác tìm () mà thay vào đó đếm và trả về số lượng kết quả khớp với truy vấn.
Làm cách nào để kiểm tra số lượng bản ghi trong MongoDB?Phương thức đếm MongoDB () – db. Bộ sưu tập. count() Phương thức count() đếm số lượng tài liệu phù hợp với tiêu chí lựa chọn. |