Tin tức và phân tích của tất cả các thiết bị di động

Cách sử dụng $lookup trong MongoDB

MongoDB là cơ sở dữ liệu NoSQL phổ biến lưu trữ dữ liệu trong các bộ sưu tập. Bộ sưu tập MongoDB bao gồm một hoặc nhiều tài liệu chứa dữ liệu thực tế ở định dạng JSON. Tài liệu tương tự như các hàng trong cơ sở dữ liệu quan hệ SQL truyền thống, trong khi các bộ sưu tập tương tự như các bảng.

Chức năng chính của cơ sở dữ liệu là khả năng truy vấn dữ liệu được lưu trữ trong cơ sở dữ liệu. Truy vấn dữ liệu cho phép bạn có được thông tin cụ thể, phân tích dữ liệu, báo cáo dữ liệu cũng như tích hợp dữ liệu.

Để có thể gửi truy vấn đến cơ sở dữ liệu một cách hiệu quả, điều quan trọng là có thể kết hợp dữ liệu từ nhiều bảng, trong trường hợp cơ sở dữ liệu SQL hoặc nhiều bộ sưu tập trong cơ sở dữ liệu NOSQL, vào một tập kết quả.

Trong $lookup MongoDB, người dùng có thể kết hợp thông tin từ hai bộ sưu tập khi truy vấn. Thực hiện tương đương với phép nối ngoài bên trái trong cơ sở dữ liệu SQL.

Cách sử dụng và mục đích của $lookup

Một chức năng quan trọng của cơ sở dữ liệu là xử lý dữ liệu để trích xuất thông tin có ý nghĩa từ dữ liệu thô.

Ví dụ: nếu bạn điều hành kinh doanh nhà hàng, bạn có thể muốn phân tích dữ liệu của nhà hàng để tìm hiểu xem bạn kiếm được bao nhiêu mỗi ngày, nhu cầu mua hàng tạp hóa vào cuối tuần và thậm chí tìm hiểu xem bạn bán được bao nhiêu tách cà phê mỗi giờ. ngày.

Đối với những nhu cầu như vậy, các truy vấn cơ sở dữ liệu đơn giản là không đủ. Bạn cần thực hiện các truy vấn nâng cao trên dữ liệu được lưu trữ. Để đáp ứng nhu cầu đó, MongoDB có một tính năng gọi là đường dẫn tổng hợp.

Quy trình tổng hợp là một hệ thống các hoạt động có thể kết hợp được gọi là các giai đoạn được sử dụng để xử lý dữ liệu nhằm tạo ra kết quả tổng hợp cuối cùng. Ví dụ về các giai đoạn trong quy trình tổng hợp bao gồm $sort, $match, $group, $merge, $count và $lookup.

Các bước này có thể được áp dụng theo bất kỳ thứ tự nào trong quy trình tổng hợp. Ở mỗi giai đoạn của quy trình tổng hợp, các thao tác khác nhau được thực hiện trên dữ liệu được gửi qua quy trình tổng hợp.

Do đó, $lookup là một bước trong quy trình tổng hợp MongoDB. $Lookup được sử dụng để thực hiện phép nối ngoài bên trái giữa hai bộ sưu tập trong cơ sở dữ liệu MongoDB. Phép nối ngoài bên trái kết hợp tất cả các tài liệu hoặc mục nhập ở phía bên trái với các tài liệu hoặc mục nhập phù hợp ở phía bên phải.

Ví dụ: hãy xem xét hai bộ sưu tập sau, được trình bày dưới dạng bảng để dễ hiểu hơn:

đơn đặt hàng_collection:

order_idcustomer_idorder_datetotal_amount11002022-05-0150.0021012022-05-0275.0031022022-05-03100.00

khách hàng_collection:

khách hàng_số khách hàng_tên khách hàng_emailkhách hàng_điện thoại100tháng 1 [email protected] [email protected]

Nếu chúng ta thực hiện phép nối ngoài bên trái trên các bộ sưu tập trên bằng cách sử dụng trường customer_id xuất hiện trong order_collection, với order_collection là bộ sưu tập bên trái và customer_collection là bộ sưu tập bên phải thì kết quả sẽ chứa tất cả các tài liệu trong Bộ sưu tập Đơn hàng và các tài liệu trong Khách hàng bộ sưu tập có số_khách hàng tương ứng với ID khách hàng của bất kỳ bản ghi nào trong bộ sưu tập đơn đặt hàng.

Kết quả cuối cùng của thao tác nối ngoài bên trái trên đơn hàng và tập hợp khách hàng trông như thế này khi được trình bày ở định dạng bảng:

Lưu ý rằng đối với khách hàng có customer_id 101 trong bộ đơn hàng không có số_khách hàng trùng khớp trong bộ khách hàng, các giá trị tương ứng bị thiếu trong bảng khách hàng sẽ được điền bằng giá trị null.

$lookup thực hiện so sánh bình đẳng nghiêm ngặt giữa các trường và truy xuất toàn bộ tài liệu trùng khớp, không chỉ các trường khớp.

Cú pháp tra cứu $

Cú pháp $lookup như sau:

{
   $lookup:
     {
       from: <collection to join>,
       localField: <field from the input documents>,
       foreignField: <field from the documents of the "from" collection>,
       as: <output array field>
     }
}

$lookup có bốn tham số:

  • from – đại diện cho bộ sưu tập mà chúng tôi muốn tìm kiếm tài liệu. Trong ví dụ trước đây của chúng tôi về việc sử dụng order_collection và customer_collection, chúng tôi sẽ đặt customer_collection làm một mục trong bộ sưu tập.
  • localField – Đây là trường trong bộ sưu tập chính hoặc đang hoạt động mà chúng tôi sử dụng để so sánh với các trường trong bộ sưu tập from của chúng tôi (trong trường hợp của chúng tôi là customer_collection). Trong ví dụ trên, localField sẽ là ID khách hàng nằm trong order_set.
  • ForeignField – đây là trường chúng tôi muốn so sánh với trong bộ sưu tập mà chúng tôi chỉ định từ đó. Trong ví dụ của chúng tôi, đây sẽ là customer_number được tìm thấy trong customer_collection mà chúng tôi sử dụng làm giá trị từ
  • as – Đây là tên trường mới mà chúng tôi cung cấp để thể hiện trường sẽ xuất hiện trong tài liệu của chúng tôi chứa các tài liệu do kết quả khớp giữa trường địa phương và trường nước ngoài. Tất cả những kết quả trùng khớp này được đưa vào một mảng trong trường này. Nếu không có kết quả trùng khớp, trường này sẽ chứa một mảng trống.

Từ hai bộ sưu tập trước đó, chúng tôi sẽ sử dụng đoạn mã sau để $tra cứu hai bộ sưu tập với bộ sưu tập đơn hàng là bộ sưu tập đang hoạt động hoặc bộ sưu tập chính của chúng tôi.

{
    $lookup: {
      from: "customers_collection",
      localField: "customer_id",
      foreignField: "customer_num",
      as: "customer_info"
 }

Lưu ý rằng trường as có thể là bất kỳ giá trị chuỗi nào. Tuy nhiên, nếu bạn đặt cho nó một cái tên đã tồn tại trong tài liệu làm việc của bạn thì trường này sẽ bị ghi đè.

Kết hợp dữ liệu từ nhiều bộ sưu tập

MongoDB $lookup là một bước hữu ích trong quy trình tổng hợp trong MongoDB. Mặc dù quy trình tổng hợp trong MongoDB không bắt buộc phải có giai đoạn tra cứu $, nhưng giai đoạn này rất quan trọng khi thực hiện các truy vấn phức tạp yêu cầu kết hợp dữ liệu từ nhiều bộ sưu tập.

Bước $lookup thực hiện phép nối ngoài bên trái trên hai bộ sưu tập, dẫn đến việc tạo trường mới hoặc ghi đè giá trị của trường hiện có bằng một mảng chứa tài liệu từ bộ sưu tập khác.

Các tài liệu này được chọn dựa trên việc chúng có chứa các giá trị khớp với giá trị của trường mà chúng đang được so sánh hay không. Kết quả cuối cùng là một trường chứa một mảng tài liệu nếu tìm thấy kết quả khớp hoặc một mảng trống nếu không tìm thấy kết quả khớp.

Hãy xem xét các bộ sưu tập nhân viên và dự án được hiển thị bên dưới.

Chúng ta có thể sử dụng đoạn mã sau để nối hai bộ sưu tập:

db.projects.aggregate([
   {
      $lookup: {
         from: "employees",
         localField: "employees",
         foreignField: "_id",
         as: "assigned_employees"
      }
   }
])

Kết quả của hoạt động này là sự hợp nhất của hai bộ sưu tập. Kết quả là các dự án và toàn bộ nhân viên được phân công vào từng dự án. Nhân viên được đại diện trong mảng.

Các bước quy trình có thể được sử dụng với $lookup

Như đã đề cập trước đó, $lookup là một bước trong quy trình tổng hợp MongoDB và có thể được sử dụng cùng với các bước khác trong quy trình tổng hợp. Để cho thấy cách sử dụng các giai đoạn này cùng với $lookup, chúng tôi sẽ sử dụng hai bộ sưu tập sau cho mục đích minh họa.

Trong MongoDB, chúng được lưu trữ ở định dạng JSON. Đây là giao diện của các bộ sưu tập trên trong MongoDB.

Dưới đây là một số ví dụ về các bước quy trình tổng hợp có thể được sử dụng với $lookup:

$match

$match là một bước quy trình tổng hợp được sử dụng để lọc luồng tài liệu nhằm chỉ cho phép những tài liệu đáp ứng một điều kiện nhất định chuyển sang bước tiếp theo trong quy trình tổng hợp. Tốt nhất nên sử dụng giai đoạn này sớm trong quy trình để loại bỏ các tài liệu không cần thiết, từ đó tối ưu hóa quy trình tổng hợp.

Sử dụng hai bộ sưu tập trước, bạn có thể kết hợp $match và $lookup như sau:

db.users.aggregate([
   {
      $match: {
         country: "USA"
      }
   },
   {
      $lookup: {
         from: "orders",
         localField: "_id",
         foreignField: "user_id",
         as: "orders"
      }
   }
])

$match được sử dụng để lọc người dùng ở Hoa Kỳ. Kết quả từ $match sau đó được kết hợp với $lookup để lấy thông tin chi tiết về đơn đặt hàng của người dùng Hoa Kỳ. Kết quả của hoạt động trên được hiển thị dưới đây:

dự án $

$project là một bước để chuyển đổi tài liệu bằng cách chỉ định trường nào sẽ bao gồm, loại trừ hoặc thêm vào tài liệu. Ví dụ: nếu bạn đang xử lý tài liệu có mười trường nhưng chỉ có bốn trường trong tài liệu chứa dữ liệu bạn cần để xử lý dữ liệu, bạn có thể sử dụng $project để lọc ra các trường bạn không cần.

Điều này tránh gửi dữ liệu dư thừa đến giai đoạn tiếp theo của quy trình tổng hợp.

Chúng ta có thể kết hợp $lookup và $project như sau:

db.users.aggregate([
   {
      $lookup: {
         from: "orders",
         localField: "_id",
         foreignField: "user_id",
         as: "orders"
      }
   },
   {
      $project: {
         name: 1,
         _id: 0,
         total_spent: { $sum: "$orders.price" }
      }
   }
])

Ở trên kết hợp các bộ sưu tập của người dùng và đơn đặt hàng bằng cách sử dụng $lookup, sau đó $project được sử dụng để chỉ hiển thị tên của từng người dùng và số tiền mà mỗi người dùng đã chi tiêu. $project cũng được sử dụng để xóa trường _id khỏi kết quả. Kết quả của hoạt động trên được hiển thị dưới đây:

$thư giãn

$unwind là bước tổng hợp được sử dụng để giải cấu trúc hoặc mở rộng trường mảng, tạo tài liệu mới cho từng phần tử trong mảng. Điều này hữu ích nếu bạn muốn chạy tổng hợp các giá trị trường mảng.

Ví dụ: trong ví dụ bên dưới, nếu bạn muốn chạy tổng hợp cho trường sở thích thì bạn không thể thực hiện vì đó là một mảng. Tuy nhiên, bạn có thể sử dụng thư giãn với $unwind và sau đó thực hiện tổng hợp trên các tài liệu kết quả.

Sử dụng tập hợp người dùng và đơn đặt hàng, chúng ta có thể sử dụng $lookup và $unwind cùng nhau như sau:

db.users.aggregate([
   {
      $lookup: {
         from: "orders",
         localField: "_id",
         foreignField: "user_id",
         as: "orders"
      }
   },
   {
      $unwind: "$orders"
   }
])

Trong đoạn mã trên, $lookup trả về một trường mảng có tên là order. $unwind sau đó được sử dụng để mở rộng trường mảng. Kết quả của thao tác này được hiển thị bên dưới: Lưu ý rằng Alice xuất hiện hai lần vì cô ấy có hai đơn đặt hàng.

Ví dụ về các trường hợp sử dụng $lookup

Khi xử lý dữ liệu, một công cụ hữu ích là $lookup. Ví dụ: bạn có thể có hai bộ sưu tập mà bạn muốn kết hợp dựa trên các trường trong bộ sưu tập chứa dữ liệu tương tự. Để thực hiện việc này, bạn có thể sử dụng bước tra cứu $ đơn giản và thêm trường mới vào bộ sưu tập chính chứa tài liệu được truy xuất từ ​​bộ sưu tập khác.

Nó đưa người dùng vào tài khoản và đặt hàng các bộ sưu tập được hiển thị bên dưới:

Hai bộ sưu tập này có thể được kết hợp bằng cách sử dụng $lookup để có được kết quả như bên dưới:

$lookup cũng có thể được sử dụng để thực hiện các cuộc gọi phức tạp hơn. Hàm $lookup không giới hạn ở việc kết hợp hai bộ sưu tập. Bạn có thể triển khai nhiều bước $lookup để thực hiện các phép nối trên nhiều hơn hai bộ sưu tập. Hãy xem xét ba bộ sưu tập được hiển thị dưới đây:

Chúng ta có thể sử dụng mã bên dưới để thực hiện phép nối ba bộ sưu tập phức tạp hơn nhằm nhận được tất cả các đơn đặt hàng cũng như thông tin chi tiết về các sản phẩm đã đặt hàng.

Đoạn mã sau cho phép chúng ta làm điều này:

db.orders.aggregate([
   {
      $lookup: {
         from: "order_items",
         localField: "_id",
         foreignField: "order_id",
         as: "order_items"
      }
   },
   {
      $unwind: "$order_items"
   },
   {
      $lookup: {
         from: "products",
         localField: "order_items.product_id",
         foreignField: "_id",
         as: "product_details"
      }
   },
   {
      $group: {
         _id: "$_id",
         customer: { $first: "$customer" },
         total: { $sum: "$order_items.price" },
         products: { $push: "$product_details" }
      }
   }
])

Kết quả của hoạt động trên được hiển thị dưới đây:

Ứng dụng

Khi xử lý dữ liệu trải rộng trên nhiều bộ sưu tập, $lookup có thể hữu ích vì nó cho phép bạn kết hợp dữ liệu và rút ra kết luận từ dữ liệu được lưu trữ trong nhiều bộ sưu tập. Việc xử lý dữ liệu hiếm khi dựa vào một tệp duy nhất.

Để rút ra kết luận có ý nghĩa từ dữ liệu, bước quan trọng là kết hợp dữ liệu từ nhiều bộ sưu tập. Do đó, hãy cân nhắc sử dụng bước $lookup trong quy trình tổng hợp MongoDB để cho phép xử lý dữ liệu tốt hơn và hiểu biết sâu sắc có ý nghĩa từ dữ liệu thô được lưu trữ trong các bộ sưu tập khác nhau.

Bạn cũng có thể làm quen với một số lệnh và truy vấn MongoDB.

Mục lục