Tra cứu, $unwind MongoDB

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.

Tra cứu, $unwind MongoDB
Tra cứu, $unwind MongoDB

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 $

Tra cứu, $unwind MongoDB
Tra cứu, $unwind MongoDB

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

Tra cứu, $unwind MongoDB
Tra cứu, $unwind MongoDB

ở đâ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

Tra cứu, $unwind MongoDB
Tra cứu, $unwind MongoDB

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 đó

Tra cứu, $unwind MongoDB
Tra cứu, $unwind MongoDB

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

Tra cứu, $unwind MongoDB
Tra cứu, $unwind MongoDB

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]

Tra cứu, $unwind MongoDB
Tra cứu, $unwind MongoDB

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

Tra cứu, $unwind MongoDB
Tra cứu, $unwind MongoDB

Đố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

Tra cứu, $unwind MongoDB
Tra cứu, $unwind MongoDB

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

Tra cứu, $unwind MongoDB
Tra cứu, $unwind MongoDB

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

Tra cứu, $unwind MongoDB
Tra cứu, $unwind MongoDB

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

Tra cứu, $unwind MongoDB
Tra cứu, $unwind MongoDB

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

Tra cứu, $unwind MongoDB
Tra cứu, $unwind MongoDB

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

Tra cứu, $unwind MongoDB
Tra cứu, $unwind MongoDB

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

Việc sử dụng $unwind trong MongoDB là gì?

Toán tử $unwind của MongoDB được sử dụng để giải cấu trúc một trường mảng trong tài liệu và tạo các tài liệu đầu ra riêng biệt cho từng mục trong mảng .

Làm cách nào để viết truy vấn tra cứu trong MongoDB?

Có bốn trường bắt buộc. .
từ. Bộ sưu tập sử dụng để tra cứu trong cùng một cơ sở dữ liệu
trường địa phương. Trường trong bộ sưu tập chính có thể được sử dụng làm mã định danh duy nhất trong bộ sưu tập từ
vùng ngoại quốc. Trường trong bộ sưu tập từ có thể được sử dụng làm mã định danh duy nhất trong bộ sưu tập chính

Làm cách nào để sử dụng tra cứu và so khớp trong MongoDB?

$lookup thực hiện so khớp bình đẳng trên ForeignField với localField từ các tài liệu đầu vào . Nếu một tài liệu trong bộ sưu tập from không chứa ForeignField , thì $lookup coi giá trị là null cho các mục đích phù hợp. Chỉ định tên của trường mảng mới để thêm vào tài liệu đầu vào.

Làm cách nào để lấy dữ liệu từ 2 bộ sưu tập trong MongoDB?

Để thực hiện MongoDB Tham gia hai bộ sưu tập, bạn phải sử dụng toán tử tra cứu $ . Nó được định nghĩa là một giai đoạn thực hiện nối ngoài bên trái với một bộ sưu tập khác và hỗ trợ lọc dữ liệu từ các tài liệu đã nối. Ví dụ: nếu người dùng yêu cầu tất cả các điểm từ tất cả học sinh, thì truy vấn bên dưới có thể được viết. Sinh viên.