Như đã biết MongoDB là một cơ sở dữ liệu hướng tài liệu với rất nhiều tính năng và ưu điểm mạnh mẽ. Một trong những tính năng mạnh mẽ đó là khung tổng hợp của MongoDB
Mục đích chính của khung tổng hợp là xử lý các bản ghi dữ liệu và trả về kết quả được tính toán. Khi sử dụng các đường ống tổng hợp, có thể nhóm các tài liệu, thực hiện nhiều phép tính số học và các hoạt động khác, thực hiện nối trái trong cơ sở dữ liệu, hợp nhất các bộ sưu tập và nhiều thứ thú vị tương tự
Cấu trúc của đường ống tổng hợp
Để thực hiện tổng hợp, cần phải có một quy trình, bao gồm nhiều giai đoạn. Các tài liệu tuần tự đi qua các giai đoạn, biến đổi tài liệu theo từng giai đoạn và chuyển nó sang giai đoạn tiếp theo. Các giai đoạn có thể chứa các toán tử đường ống khác nhau để làm việc với mảng, chuỗi, ngày, v.v.
Khi bắt đầu một tập hợp, chỉ cần chạy lệnh shell mongo sau đây là đủ
db. getCollection[tên bộ sưu tập]. tổng hợp [đường ống]
trong đó collectionName là tên của bộ sưu tập mà đường ống tổng hợp cần chạy và đường ống là đường ống tổng hợp [mảng các giai đoạn]
Tham gia trái bằng cách sử dụng $lookup
tài liệu tra cứu $
Giai đoạn $lookup cho phép bạn “tham gia” một bộ sưu tập bằng cách thực hiện khớp bình đẳng giữa các trường của bộ sưu tập hiện tại và “đã tham gia”. Giai đoạn này yêu cầu chỉ định một số tùy chọn chính như bộ sưu tập và tên trường
Trong trường hợp này, chúng ta cần thêm một mảng sách mới vào tài liệu của bộ sưu tập hiện tại bằng cách chọn tài liệu từ bộ sưu tập sách dựa trên mảng ID của sách
ở đâu
từ. tên bộ sưu tập "đã tham gia"
trường địa phương. tên trường cục bộ sẽ được sử dụng cho một đối sánh bình đẳng
vùng ngoại quốc. tên trường trong bộ sưu tập "đã tham gia" sẽ được sử dụng để khớp bình đẳng
như. tên trường đầu ra
Phân loại tài liệu bằng cách sử dụng $group và $unwind
$group tài liệu , $unwind document
Có rất nhiều trường hợp khi chúng ta cần phân loại tài liệu dựa trên một số tiêu chí và một trong những cách để làm điều này là sử dụng các giai đoạn $unwind và $group
Ví dụ: giả sử có người dùng đã chỉ định danh sách sách yêu thích của họ. Chúng tôi cần một quy trình sẽ tạo các tài liệu riêng biệt cho từng cuốn sách trong đó mỗi tài liệu sẽ chứa danh sách những người dùng thích cuốn sách đó
Vì tài liệu của người dùng chỉ chứa ID đối tượng của những cuốn sách yêu thích của họ, nên trong quy trình ở trên, chúng tôi đã sử dụng giai đoạn tra cứu $ để đưa toàn bộ đối tượng sách vào mảng sách
Bằng cách sử dụng giai đoạn $unwind, chúng tôi giải cấu trúc tài liệu người dùng và xây dựng lại chúng bằng cách sử dụng giai đoạn $group. Trong giai đoạn nhóm $, chúng tôi tích lũy tên người dùng vào mảng người dùng
Phân loại tài liệu bằng $bucketAuto
tài liệu $bucketAuto
Một giai đoạn khác cho phép bạn phân loại tài liệu là $bucketAuto. Nó tự động xác định các nhóm dựa trên các tham số đã cho và nhóm tài liệu dựa trên phạm vi tối thiểu/tối đa
Trong trường hợp này, chúng tôi muốn phân loại người dùng dựa trên số lượng sách của họ. Như bạn có thể thấy, có ba nhóm được xác định trong phần đầu ra trong đó mỗi nhóm có phạm vi tối thiểu và tối đa
thùng 1 [1, 2]
thùng 2 [2, 4]
thùng 3 [4]
Có hai giai đoạn được sử dụng trong quy trình ở trên, $addFields bổ sung số lượng sách cho mỗi tài liệu người dùng và $bucketAuto nhóm các tài liệu theo trường BooksCount
Trong giai đoạn $bucketAuto đã chỉ định các trường sau
nhómBy. tên trường theo đó các tài liệu sẽ được nhóm lại [cũng có thể là một biểu thức]
xô. số lượng xô tối đa
đầu ra. đặc tả tài liệu đầu ra
Nhiều đường ống trong một giai đoạn sử dụng $facet
tài liệu $facet
Đối với trường hợp này, chúng tôi muốn kết hợp nhiều quy trình vào một giai đoạn duy nhất. Là đầu ra của tổng hợp, chúng ta cần có hai mảng người dùng được nhóm, một nhóm theo số lượng sách và một nhóm khác theo ID sách
Trong quy trình ở trên, ở giai đoạn $facet, chúng tôi đã xác định hai quy trình có tên là groupedByBooksCount và groupedByBooks. Sau khi thực hiện, đầu ra của mỗi đường ống sẽ được lưu trữ trong khóa thích hợp
Truy vấn vị trí sử dụng $geoNear
tài liệu $geoNear
Như đã nói trong tài liệu, $geoNear xuất tài liệu theo thứ tự từ gần nhất đến xa nhất tính từ một điểm xác định
Trong ví dụ này, chúng tôi có một bộ sưu tập có tên là các thành phố trong đó mỗi tài liệu chứa tên và tọa độ của một thành phố cụ thể. Một trong những thành phố trong bộ sưu tập đó là Yerevan. Chúng tôi cần thêm một trường mới vào tất cả các tài liệu sẽ cho biết khoảng cách giữa Yerevan và vị trí thành phố hiện tại
Trong đường dẫn ở trên, mảng tọa độ chứa tọa độ địa lý của Yerevan. Giá trị của distanceField là tên trường sẽ chứa khoảng cách giữa hai thành phố và distanceMultiplier dùng để chuyển đổi khoảng cách từ mét sang km
Note: To use $geoNear stage, on the coordinates field must be created 2d or 2dsphere index.
Tìm kiếm đệ quy sử dụng $graphLookup
tài liệu $graphLookup
Sử dụng $graphLookup có thể thực hiện tìm kiếm đệ quy trên một bộ sưu tập. Nó điền đệ quy tất cả các tài liệu được kết nối dựa trên các trường được chỉ định
Trong ví dụ này, hoạt động $graphLookup khớp đệ quy với các trường báo cáo Đến và tên trong bộ sưu tập của người dùng, trả về hệ thống phân cấp báo cáo cho mỗi người dùng
Trong đường ống ở trên có ba giai đoạn
$graphLookup — tìm đệ quy các tài liệu liên quan và xuất chúng thành mảng báo cáoHierarchy
$unwind — giải cấu trúc và thêm vào mảng Phân cấp báo cáo
$group - xây dựng lại tài liệu và ghi đè mảng báo cáoHierarchy hiện có chỉ để lại tên người dùng
Lưu trữ đầu ra đường ống vào bộ sưu tập bằng cách sử dụng $out
$out tài liệu
Giai đoạn này lấy các tài liệu được trả về bởi đường dẫn tổng hợp và ghi chúng vào một bộ sưu tập được chỉ định
Ghi chú. Giai đoạn $out phải là giai đoạn cuối cùng trong quy trình
Trong ví dụ cụ thể này, chúng tôi đã thêm giai đoạn $out vào cuối quy trình sẽ lưu đầu ra của giai đoạn cuối vào bộ sưu tập khoảng cách trong cùng một cơ sở dữ liệu
Phần kết luận
Trong bài viết này, chúng tôi đã đề cập đến rất ít tính năng của khung tổng hợp của MongoDB. Để học sâu, tôi khuyên bạn nên xem tài liệu chính thức và thực hiện một số công việc thực hành bằng cách sử dụng cơ sở dữ liệu thử nghiệm