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 customers trong cơ sở dữ liệu sales. Trong phần đầu tiên, bạn đã sử dụng IntelliShell để tạo câu lệnh và lưu nó vào state_transactions. tập tin js. Trong phần thứ hai, bạn đã nhập tệp vào Trình chỉnh sửa tập hợp, nơi bạn đã thêm hai giai đoạn vào quy trình bán hàng. Cùng với nhau, các phần này cung cấp cho bạn nền tảng để làm việc với các câu lệnh aggregate trong cả IntelliShell và Trình chỉnh sửa tổng hợp

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 aggregate trong năm tài liệu hàng đầu có tỷ lệ cao nhất

Đến cuối phần này, bạn sẽ học cách

  • Thêm dữ liệu tra cứu vào quy trình tổng hợp
  • Chuyển đổi giá trị chuỗi trong một trong các trường tra cứu thành số nguyên
  • Thêm trường tỷ lệ được tính toán dựa trên trường tra cứu đã chuyển đổi
  • Giới hạn số lượng tài liệu trả lại

Những gì bạn sẽ cần

  • Truy cập vào cụm MongoDB Atlas
  • Truy cập vào các trạng thái_giao dịch. js mà bạn đã cập nhật trong phần thứ hai
  • Khả năng tải xuống một. tệp json từ internet

Làm việc với các toán tử tổng hợp nâng cao

Chì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 aggregate của mình

  • $match. Lọc ra tất cả các tài liệu từ quy trình ngoại trừ những tài liệu phù hợp với điều kiện đã chỉ định
  • nhóm $. Nhóm các tài liệu dựa trên một biểu thức đã chỉ định và xuất một tài liệu cho mỗi nhóm. Các tài liệu được xuất ra thường bao gồm một hoặc nhiều trường được tính toán để tính toán các giá trị tích lũy
  • dự án $. Tái cấu trúc từng tài liệu trong đường ống bằng cách thêm, giữ lại, định hình lại hoặc loại bỏ các trường
  • $replaceRoot. Thay thế từng tài liệu trong quy trình bán hàng bằng tài liệu được nhúng đã chỉ định.  
  • $sắp xếp. Sắp xếp lại các tài liệu trong đường ống dựa trên logic sắp xếp đã chỉ đị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

  • Đối số
    db.invoices.aggregate([
      {
        $lookup:
        {
          from: "products",
          localField: "product_sku",
          foreignField: "sku",
          as: "product_info"
        }
      }
    ])
    6 chỉ định tên của bộ sưu tập thứ cấp, bộ sưu tập này phải nằm trong cùng một cơ sở dữ liệu
  • Đối số
    db.invoices.aggregate([
      {
        $lookup:
        {
          from: "products",
          localField: "product_sku",
          foreignField: "sku",
          as: "product_info"
        }
      }
    ])
    7 chỉ định tên của trường trong bộ sưu tập chính dựa trên đối sánh
  • Đối số
    db.invoices.aggregate([
      {
        $lookup:
        {
          from: "products",
          localField: "product_sku",
          foreignField: "sku",
          as: "product_info"
        }
      }
    ])
    8 chỉ định tên của trường trong bộ sưu tập thứ cấp dựa trên đối sánh
  • Đối số
    db.invoices.aggregate([
      {
        $lookup:
        {
          from: "products",
          localField: "product_sku",
          foreignField: "sku",
          as: "product_info"
        }
      }
    ])
    9 chỉ định tên của trường mảng sẽ được thêm vào tài liệu trong bộ sưu tập chính hoặc chính xác hơn là vào tài liệu trong đường dẫn tổng hợp. Mảng sẽ chứa các tài liệu phù hợp từ bộ sưu tập thứ cấp

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

  • Đối số
    db.invoices.aggregate([
      {
        $lookup:
        {
          from: "products",
          localField: "product_sku",
          foreignField: "sku",
          as: "product_info"
        }
      }
    ])
    6 chỉ định
    $set: { new_field_name: field_expression, .. }
    1 là bộ sưu tập thứ cấp.  
  • Đối số
    db.invoices.aggregate([
      {
        $lookup:
        {
          from: "products",
          localField: "product_sku",
          foreignField: "sku",
          as: "product_info"
        }
      }
    ])
    7 chỉ định trường
    $set: { new_field_name: field_expression, .. }
    6 trong tập hợp
    $set: { new_field_name: field_expression, .. }
    0
  • Đối số
    db.invoices.aggregate([
      {
        $lookup:
        {
          from: "products",
          localField: "product_sku",
          foreignField: "sku",
          as: "product_info"
        }
      }
    ])
    8 chỉ định trường
    $set: { new_field_name: field_expression, .. }
    8 trong bộ sưu tập
    $set: { new_field_name: field_expression, .. }
    1
  • Đối số
    db.invoices.aggregate([
      {
        $lookup:
        {
          from: "products",
          localField: "product_sku",
          foreignField: "sku",
          as: "product_info"
        }
      }
    ])
    9 gán tên
    $limit: positive_integer
    0 cho trường mảng mới được thêm vào đường dẫ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_integer
0, 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

Làm cách nào để sử dụng đối sánh với tra cứu trong MongoDB?

Tài liệu đầu tiên trong kết quả được mở rộng để hiển thị mảng

$limit: positive_integer
0 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_integer
0 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_integer
9, là bí danh của toán tử
db.invoices.aggregate([ { $limit: 25 } ])
0. Toán tử
$limit: positive_integer
9 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_integer
9

$set: { new_field_name: field_expression, .. }

Khi sử dụng toán tử

$limit: positive_integer
9 để 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

Làm cách nào để sử dụng đối sánh với tra cứu trong MongoDB?

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ử customers2, giới hạn số lượng tài liệu được chuyển đến giai đoạn tiếp theo trong quy trình. Nếu bạn thêm một giai đoạn customers2 ngay sau giai đoạn customers4 mà không có bất kỳ giai đoạn xen kẽ nào, MongoDB có thể hợp nhất hai giai đoạn để giảm số mục cần lưu trữ trong bộ nhớ

Để sử dụng toán tử customers2, bạn chỉ cần chỉ định tên toán tử và một số nguyên dương làm biểu thức của nó. Số nguyên xác định số lượng tài liệu tối đa được đưa vào quy trình bán hàng, như thể hiện trong cú pháp sau

$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 customers2

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