Contents

Cách sử dụng Đường dẫn tổng hợp trong MongoDB

Quy trình tổng hợp là cách được khuyến nghị để chạy các truy vấn phức tạp trong MongoDB. Nếu bạn đang sử dụng MapReduce của MongoDB, tốt nhất bạn nên chuyển sang quy trình tổng hợp để tính toán hiệu quả hơn.

Tập hợp trong MongoDB là gì và nó hoạt động như thế nào?

/vi/images/aggregation-pipeline-process-example-1.jpeg

Đường ống tổng hợp, còn được gọi là đường ống “Agg”, là một cơ chế truy vấn toàn diện trong MongoDB tạo điều kiện thuận lợi cho việc phân tích và thao tác dữ liệu phức tạp. Bằng cách sử dụng một loạt các giai đoạn được kết nối với nhau, quy trình này cho phép người dùng thực hiện nhiều thao tác khác nhau trên tập dữ liệu của họ bằng cách tận dụng đầu ra của một giai đoạn làm đầu vào cho các giai đoạn tiếp theo. Công cụ đa năng này cho phép người dùng hợp lý hóa các tác vụ xử lý dữ liệu của họ đồng thời nâng cao hiệu quả và độ chính xác tổng thể.

Ví dụ, người ta có thể truyền kết quả của quá trình so khớp tới các giai đoạn tiếp theo để sắp xếp lại theo cách sắp xếp đã nói cho đến khi đạt được đầu ra ưu tiên.

Trong suốt quá trình tổng hợp, mỗi giai đoạn bao gồm một thành phần MongoDB và tạo ra một hoặc nhiều tài liệu được sửa đổi làm đầu ra. Tần suất xuất hiện một mức cụ thể trong quy trình phụ thuộc vào tính chất cụ thể của cuộc điều tra đang được thực hiện. Trong một số trường hợp, có thể cần phải kết hợp các toán tử như

Các giai đoạn của đường ống tổng hợp

Đường dẫn tổng hợp chuyển dữ liệu qua nhiều giai đoạn trong một truy vấn. Có một số giai đoạn và bạn có thể tìm thấy thông tin chi tiết về chúng trong tài liệu MongoDB.

Chúng ta hãy mô tả một số thuật ngữ phổ biến nhất trong bối cảnh này.

Giai đoạn $match

Giai đoạn đầu của quá trình này cho phép thiết lập các tiêu chí chính xác để lựa chọn, tiêu chí này có thể được sử dụng trước khi bắt đầu bất kỳ giai đoạn tổng hợp tiếp theo nào. Bằng cách sử dụng bước sơ bộ này, người ta có thể xác định và tách biệt các thành phần tập dữ liệu cụ thể được coi là có liên quan để đưa vào quy trình tổng hợp rộng hơn.

Giai đoạn $group

Giai đoạn nhóm tổ chức thông tin thành các danh mục riêng biệt bằng cách sử dụng các cặp khóa-giá trị, với mỗi danh mục tương ứng với một thành phần trong báo cáo cuối cùng.

Hãy xem xét dữ liệu mẫu bán hàng minh họa sau đây làm ví dụ:

/vi/images/sample-data-for-example.jpg

Việc sử dụng quy trình tổng hợp cho phép tính toán cả số lượng bán hàng tổng thể và các sản phẩm tạo doanh thu cao nhất trong từng danh mục tương ứng.

 {
 $group: {
    _id: $Section,
    total_sales_count: {$sum : $Sold},
    top_sales: {$max: $Amount},
  }
}

Chức năng nhóm của MongoDB cho phép các tài liệu được sắp xếp theo các phân chia theo phần của chúng. Điều này đạt được thông qua việc sử dụng trường \_\ id kết hợp với một khóa được chỉ định. Khi sử dụng các toán tử tổng hợp cụ thể như \ \ sum, \ \ min, \ \ max hoặc \ \_avg, MongoDB sẽ tạo các mã định danh mới cho từng nhóm dựa trên các hoạt động được mô tả trong trình tổng hợp.

Giai đoạn $skip

Việc sử dụng giai đoạn “$skip” trong quy trình tổng hợp cho phép loại bỏ một số tài liệu được xác định trước khỏi tập kết quả cuối cùng. Thông thường, giai đoạn này được sử dụng sau giai đoạn nhóm và dùng để hợp lý hóa đầu ra bằng cách loại trừ những tài liệu không mong muốn. Để minh họa, nếu dự kiến ​​sẽ có hai tài liệu được tạo ra nhưng một tài liệu phải bị loại bỏ thì quá trình tổng hợp sẽ chỉ mang lại tài liệu còn lại.

Để kết hợp bước bỏ qua trong quy trình tổng hợp, bạn có thể đưa thao tác “$skip” vào trong đó.

 ...,
{
    $skip: 1
  },

Giai đoạn $sort

Quá trình sắp xếp cho phép tổ chức thông tin theo cách giảm dần hoặc tăng dần. Để minh họa, người ta có thể chọn sắp xếp lại tập dữ liệu từ kịch bản truy vấn trước đó với thứ tự mức độ giảm dần để phân biệt bộ phận nào thể hiện mức doanh số cao nhất.

Sửa đổi truy vấn trước bằng cách kết hợp toán tử “$sort”, như sau:

 ...,
{
    $sort: {top_sales: -1}
  },

Giai đoạn giới hạn $

Việc sử dụng thao tác “giới hạn” tạo điều kiện thuận lợi cho việc giảm bớt các tài liệu đầu ra mong muốn được thể hiện bằng một đường dẫn tổng hợp. Để minh họa khái niệm này, hãy xem xét việc áp dụng toán tử “$limit” để truy xuất phần cụ thể đã được xác định là đã đạt được mức doanh số cao nhất trong giai đoạn xử lý trước đó:

 ...,
{
    $sort: {top_sales: -1}
  },

{"$limit": 1}

Kết quả nói trên chỉ mang lại tài liệu ban đầu; phân khúc cụ thể này tạo thành phần có doanh thu lớn nhất vì nó chiếm vị trí cao nhất trong danh sách kết quả được sắp xếp.

Giai đoạn của dự án $

Lệnh $project cung cấp mức độ linh hoạt trong việc định hình đầu ra cuối cùng bằng cách cho phép chỉ định các trường mong muốn và tên khóa tương ứng của chúng.

Thật vậy, hãy xem xét một ví dụ minh họa về đầu ra không bao gồm giai đoạn “$project”, có thể xuất hiện như sau:

/vi/images/sample-unarranged-data-for-aggregation-pipeline.jpg

Để kết hợp dự án trong quy trình của chúng tôi, chúng tôi sẽ kiểm tra hình thức của nó khi được liên kết với nhãn “$project”. Để đạt được sự tích hợp này, hãy làm theo các bước sau:

 ...,

{
        "$project": {
            "_id": 0,
            "Section": "$_id",
            "TotalSold": "$total_sales_count",
            "TopSale": "$top_sales",

        }
    }

Có tính đến việc sắp xếp dữ liệu theo danh mục sản phẩm trước đây của chúng tôi, phương pháp nói trên kết hợp tất cả các phần sản phẩm có liên quan trong báo cáo được tạo. Hơn nữa, nó đảm bảo rằng cả doanh số bán hàng tổng thể và mặt hàng bán chạy nhất được nêu bật đều được tích hợp như một phần của kết quả cuối cùng, được thể hiện tương ứng thông qua các chỉ số “Tổng số hàng đã bán” và “Bán hàng nhiều nhất”.

Kết quả sửa đổi thể hiện mức độ sàng lọc cao hơn khi so sánh với kết quả trước đó, thể hiện tính tổ chức được cải thiện và sự rõ ràng trong cách trình bày.

/vi/images/sample-output-for-aggregation-pipeline-stages.jpg

Giai đoạn thư giãn $

Giai đoạn thư giãn trong MongoDB chịu trách nhiệm giải cấu trúc một mảng có trong một tài liệu và chuyển nó thành nhiều tài liệu. Để minh họa, chúng ta hãy xem xét tập dữ liệu đơn đặt hàng mẫu sau:

/vi/images/sample-orders-data.jpg

Việc sử dụng giai đoạn $unwind là một phương pháp hiệu quả để tháo rời mảng item trước khi thực hiện các hoạt động tổng hợp bổ sung. Bước này tỏ ra đặc biệt hữu ích khi cố gắng tính toán thống kê tóm tắt cho từng phần tử trong mảng. Như một ví dụ minh họa, hãy xem xét việc tính toán tổng doanh thu được tạo ra bởi các sản phẩm riêng lẻ.

 db.Orders.aggregate(
[
  {
    "$unwind": "$items"
  },
  {
    "$group": {
      "_id": "$items.product",
      "total_revenue": { "$sum": { "$multiply": ["$items.quantity", "$items.price"] } }
    }
  },
  {
    "$sort": { "total_revenue":-1 }
  },

  {
        "$project": {
            "_id": 0,
            "Product": "$_id",
            "TotalRevenue": "$total_revenue",

        }
    }
])

Chắc chắn, đây là một bản trình bày tinh tế hơn về kết quả được tạo ra bởi cuộc điều tra tổng hợp đã đề cập trước đó:

/vi/images/sample-result-for-unwind-stage.jpg

Cách tạo một đường dẫn tổng hợp trong MongoDB

Các giai đoạn nói trên cung cấp sự hiểu biết toàn diện về quy trình ứng dụng cho các hoạt động khác nhau trong quy trình tổng hợp, bao gồm các truy vấn cơ bản liên quan đến từng giai đoạn.

Cho phép tôi cung cấp bản trình bày tinh tế hơn của văn bản đã cho: Dựa trên việc kiểm tra tập dữ liệu bán hàng trước đó của chúng tôi, nên trình bày tổng quan về một số giai đoạn chính trong toàn bộ quy trình tổng hợp. Bằng cách đó, chúng ta có thể có được cái nhìn toàn diện về quá trình liên quan đến việc chuyển đổi dữ liệu thô thành những hiểu biết sâu sắc có ý nghĩa.

 db.sales.aggregate([

    {
        "$match": {
            "Sold": { "$gte": 5 }
            }
    },

        {

        "$group": {
            "_id": "$Section",
            "total_sales_count": { "$sum": "$Sold" },
            "top_sales": { "$max": "$Amount" },
            
        }

    },

    {
        "$sort": { "top_sales":-1 }
    },

    {"$skip": 0},

    {
        "$project": {
            "_id": 0,
            "Section": "$_id",
            "TotalSold": "$total_sales_count",
            "TopSale": "$top_sales",

        }
    }
    
])

Sản phẩm cuối cùng có sự tương đồng đáng kinh ngạc với thứ gì đó đã từng gặp trước đây, gợi lên cảm giác quen thuộc và thậm chí có thể là deja vu.

/vi/images/sample-output-for-aggregation-pipeline-stages.jpg

Đường ống tổng hợp so với MapReduce

Trước khi loại bỏ nó bắt đầu từ phiên bản 5.0 của MongoDB, phương pháp truyền thống để thực hiện tổng hợp dữ liệu trong cơ sở dữ liệu là thông qua việc sử dụng MapReduce. Mặc dù MapReduce sở hữu nhiều ứng dụng tiềm năng bên ngoài MongoDB, nhưng nó thường được coi là kém hiệu quả hơn so với quy trình tổng hợp, đòi hỏi phải sử dụng tập lệnh bên ngoài để xác định riêng cả quy trình ánh xạ và rút gọn.

Ngược lại, quy trình tổng hợp trong MongoDB cung cấp một phương pháp duy nhất để thực hiện các truy vấn phức tạp trong khi vẫn duy trì hiệu quả và tổ chức cao hơn so với các phương pháp khác. Hơn nữa, quy trình này kết hợp các tính năng bổ sung cho phép tăng cường tùy chỉnh kết quả đầu ra.

Quá trình chuyển đổi từ MapReduce sang quy trình tổng hợp thể hiện vô số điểm khác biệt mà người ta có thể gặp phải trong quá trình này.

Thực hiện các truy vấn dữ liệu lớn hiệu quả trong MongoDB

Để xử lý hiệu quả thông tin phức tạp được lưu trữ trong MongoDB, điều quan trọng là phải tối ưu hóa các truy vấn của bạn để đạt hiệu quả tối đa. May mắn thay, quy trình tổng hợp cung cấp một giải pháp tuyệt vời để thực hiện các phép tính toàn diện trên các tập dữ liệu phức tạp. Trái ngược với các hoạt động riêng lẻ thường xuyên làm ảnh hưởng đến hiệu suất, khung tổng hợp cho phép người dùng hợp lý hóa nhiều bước xử lý thành một quy trình đơn lẻ, hiệu quả cao. Bằng cách đó, những tác vụ cồng kềnh này có thể được thực hiện với tốc độ và độ chính xác cao hơn một cách thống nhất.

Việc sử dụng tính năng lập chỉ mục có thể nâng cao đáng kể hiệu suất của các hoạt động tổng hợp trong MongoDB, vì nó làm giảm khối lượng dữ liệu phải được quét ở mỗi giai đoạn của quy trình.