Làm cách nào để sử dụng đối sánh với tra cứu trong MongoDB?
Hai phần đầu tiên của khóa học này hướng dẫn bạn quy trình xây dựng một câu lệnh tổng hợp truy xuất dữ liệu từ bộ sưu tập Show
Trong phần này, bạn sẽ tinh chỉnh câu lệnh hơn nữa, nhập lại câu lệnh đó vào Trình chỉnh sửa tập hợp. Lần này, bạn sẽ thêm ba giai đoạn nữa và cập nhật một số giai đoạn hiện có. Ở một trong các giai đoạn mới, bạn sẽ thực hiện thao tác tra cứu để truy xuất dữ liệu từ bộ sưu tập thứ hai trong cùng một cơ sở dữ liệu. Sau đó, bạn sẽ chuyển đổi các giá trị trong một trong các trường tra cứu, rồi thêm một trường sử dụng các giá trị đó để tính tỷ lệ. Cuối cùng, bạn sẽ giới hạn kết quả của câu lệnh Đến cuối phần này, bạn sẽ học cách
Những gì bạn sẽ cần
Làm việc với các toán tử tổng hợp nâng caoChìa khóa để xây dựng một tuyên bố tổng hợp là đảm bảo rằng nó bao gồm các giai đoạn cần thiết để xử lý tài liệu theo đúng trình tự và trả về kết quả mong muốn. Để trợ giúp cho các giai đoạn này, MongoDB cung cấp một tập hợp các toán tử tổng hợp thực hiện các hoạt động khác nhau trên đường dẫn tổng hợp. Mỗi giai đoạn trong quy trình được liên kết với một toán tử tổng hợp duy nhất xác định cách các tài liệu đã nhập sẽ được xử lý và xuất sang giai đoạn quy trình tiếp theo Trong hai phần đầu tiên của khóa học này, bạn đã làm việc với các toán tử sau khi xây dựng câu lệnh
Tại thời điểm này, bạn đã khá quen thuộc với các toán tử này, nhưng nếu bạn có bất kỳ câu hỏi nào về chúng, hãy tham khảo hai phần đầu tiên trong khóa học này hoặc tài liệu MongoDB tra cứu $Trong phần này của khóa học, bạn sẽ học cách sử dụng một số toán tử tổng hợp khác. Toán tử đầu tiên trong số này là toán tử db.invoices.aggregate([ { $lookup: { from: "products", localField: "product_sku", foreignField: "sku", as: "product_info" } } ])1, nối các tài liệu trong bộ sưu tập chính với các tài liệu trong bộ sưu tập thứ cấp. Bộ sưu tập chính là bộ sưu tập mà bạn dựa vào đó để tuyên bố aggregate của mình. Bộ sưu tập thứ cấp là bộ chứa dữ liệu bạn sẽ kết hợp vào quy trình tổng hợp dựa trên các giá trị phù hợp. Để sử dụng toán tử db.invoices.aggregate([ { $lookup: { from: "products", localField: "product_sku", foreignField: "sku", as: "product_info" } } ])1, bộ sưu tập thứ cấp phải không được phân đoạn và nằm trong cùng cơ sở dữ liệu với bộ sưu tập chính. Khi bạn chạy một giai đoạn dựa trên toán tử db.invoices.aggregate([ { $lookup: { from: "products", localField: "product_sku", foreignField: "sku", as: "product_info" } } ])1, MongoDB sẽ thêm một trường mảng vào mỗi tài liệu trong bộ sưu tập chính. Trường mảng bao gồm một phần tử cho mỗi tài liệu trong bộ sưu tập thứ cấp phù hợp với các điều kiện do toán tử đặt. Ví dụ: nếu chỉ có một tài liệu khớp với điều kiện đã chỉ định, thì mảng sẽ chỉ bao gồm một phần tử, phần tử này sẽ chứa tài liệu phù hợp Loại hoạt động tra cứu cơ bản nhất được gọi là đối sánh vốn chủ sở hữu. Trong đối sánh vốn chủ sở hữu, các tài liệu trong bộ sưu tập chính chứa một trường khớp với một trường trong bộ sưu tập thứ cấp. Tài liệu được coi là khớp giữa hai bộ sưu tập khi các giá trị trường bằng nhau. Cú pháp sau đây cho thấy các yếu tố cần thiết để thực hiện khớp vốn chủ sở hữu $lookup: { from: secondary_collection, localField: primary_collection_field, foreignField: secondary_collection_field, as: new_array_field_name } Toán tử db.invoices.aggregate([ { $lookup: { from: "products", localField: "product_sku", foreignField: "sku", as: "product_info" } } ])1 nhận bốn đối số mà bạn chuyển vào toán tử dưới dạng tài liệu có bốn trường
Để chứng minh điều này hoạt động như thế nào, giả sử bạn có hai tập hợp— $set: { new_field_name: field_expression, .. }0 và $set: { new_field_name: field_expression, .. }1—và bạn đang xây dựng một câu lệnh aggregate dựa trên tập hợp $set: { new_field_name: field_expression, .. }0 Đối với mỗi tài liệu trong bộ sưu tập $set: { new_field_name: field_expression, .. }0, bạn muốn truy xuất thông tin cụ thể về sản phẩm từ bộ sưu tập $set: { new_field_name: field_expression, .. }1. Trường $set: { new_field_name: field_expression, .. }6 trong bộ sưu tập $set: { new_field_name: field_expression, .. }0 khớp với trường $set: { new_field_name: field_expression, .. }8 trong bộ sưu tập $set: { new_field_name: field_expression, .. }1, vì vậy bạn có thể sử dụng các trường này với toán tử db.invoices.aggregate([ { $lookup: { from: "products", localField: "product_sku", foreignField: "sku", as: "product_info" } } ])1 để thực hiện đối sánh vốn chủ sở hữu, như minh họa trong ví dụ sau db.invoices.aggregate([ { $lookup: { from: "products", localField: "product_sku", foreignField: "sku", as: "product_info" } } ]) Ví dụ nên khá đơn giản
Nếu bạn chạy câu lệnh này, nó sẽ trả về các tài liệu trong bộ sưu tập $set: { new_field_name: field_expression, .. }0 và mỗi tài liệu sẽ chứa trường mảng $limit: positive_integer0, trường này sẽ bao gồm một phần tử cho mỗi tài liệu phù hợp (hoặc không có phần tử nào nếu không có tài liệu phù hợp). Hình dưới đây cho thấy một ví dụ về kết quả có thể trông như thế nào khi được hiển thị trong Chế độ xem dạng cây Tài liệu đầu tiên trong kết quả được mở rộng để hiển thị mảng $limit: positive_integer0 và các phần tử của nó. Trong trường hợp này, mảng chỉ chứa một phần tử, có nghĩa là chỉ một tài liệu trong bộ sưu tập $set: { new_field_name: field_expression, .. }1 phù hợp với tiêu chí đã chỉ định. Lưu ý rằng giá trị $set: { new_field_name: field_expression, .. }8 trong mảng $limit: positive_integer0 có cùng giá trị với giá trị $set: { new_field_name: field_expression, .. }6 trong tài liệu chính. Trong các bài tập tiếp theo, bạn sẽ có cái nhìn sâu hơn về hoạt động của toán tử db.invoices.aggregate([ { $lookup: { from: "products", localField: "product_sku", foreignField: "sku", as: "product_info" } } ])1 và các loại kết quả mà bạn có thể mong đợi bộ $Một toán tử khác mà chúng ta sẽ đề cập trong các bài tập là toán tử $limit: positive_integer9, là bí danh của toán tử db.invoices.aggregate([ { $limit: 25 } ])0. Toán tử $limit: positive_integer9 thêm một hoặc nhiều trường vào quy trình tổng hợp, với các giá trị trường được xác định bởi biểu thức của toán tử. Nếu tên được sử dụng cho một trường mới giống với tên hiện có, MongoDB sẽ ghi đè các giá trị trong trường hiện có bằng các giá trị được xác định trong biểu thức của toán tử. Cú pháp sau hiển thị các thành phần tạo nên một biểu thức $limit: positive_integer9 $set: { new_field_name: field_expression, .. } Khi sử dụng toán tử $limit: positive_integer9 để tạo trường, bạn phải cung cấp tên trường, theo sau là biểu thức xác định giá trị của trường. Ví dụ: câu lệnh tổng hợp sau đây thêm một trường có tên db.invoices.aggregate([ { $limit: 25 } ])4 vào quy trình bán hàng và sử dụng toán tử db.invoices.aggregate([ { $limit: 25 } ])5 để đặt giá trị của nó db.invoices.aggregate([ { $set: { total: { $add: [ "$subtotal", "$tax", "$shipping" ] } } } ]) Toán tử db.invoices.aggregate([ { $limit: 25 } ])5 cộng các giá trị từ các trường db.invoices.aggregate([ { $limit: 25 } ])7, db.invoices.aggregate([ { $limit: 25 } ])8 và db.invoices.aggregate([ { $limit: 25 } ])9 trong tập hợp $set: { new_field_name: field_expression, .. }0 lại với nhau. Trường db.invoices.aggregate([ { $limit: 25 } ])4 sau đó được thêm vào quy trình bán hàng, cùng với các trường khác trong tài liệu của bộ sưu tập. Hình dưới đây cho thấy dữ liệu đầu ra có thể trông như thế nào sau khi trường mới được thêm vào quy trình giới hạn $Các bài tập trong phần này cũng giới thiệu cho bạn về toán tử Để sử dụng toán tử $limit: positive_integer Ví dụ: nếu bạn muốn giới hạn số lượng tài liệu trong bộ sưu tập hóa đơn là 25, bạn có thể xác định giai đoạn đó như sau db.invoices.aggregate([ { $limit: 25 } ]) Bây giờ, chỉ 25 tài liệu hàng đầu sẽ được trả lại, dựa trên cách các tài liệu được sắp xếp khi nhập vào giai đoạn Làm cách nào để sử dụng đối sánh và tra cứu 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.
Tra cứu hoạt động như thế nào trong MongoDB?$lookup thực hiện so khớp bình đẳng trên localField với ForeignField từ các tài liệu của bộ sưu tập from . Nếu một tài liệu đầu vào không chứa localField , thì $lookup coi trường đó có giá trị null cho các mục đích phù hợp.
Chúng tôi có thể sử dụng $match trong Find MongoDB không?Về cơ bản, MongoDB cung cấp các toán tử đối sánh khác nhau như $match và $count, v.v. cho người dùng và chúng tôi có thể sử dụng chúng theo yêu cầu của mình. We can also use a match operator for the aggregation pipeline.
Làm cách nào để khớp giá trị mảng trong MongoDB?Toán tử $elemMatch khớp với các tài liệu chứa trường mảng có ít nhất một phần tử khớp với tất cả các tiêu chí truy vấn đã chỉ định. Nếu bạn chỉ xác định một điều kiện |