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

Spread the love

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?

Quy trình tổng hợp là một quy trình gồm nhiều giai đoạn để chạy các truy vấn nâng cao trong MongoDB. Nó xử lý dữ liệu thông qua các giai đoạn khác nhau được gọi là đường ống. Bạn có thể sử dụng kết quả được tạo từ một cấp độ làm mẫu hoạt động ở cấp độ khác.

Ví dụ: bạn có thể chuyển kết quả của thao tác so khớp sang giai đoạn khác để sắp xếp theo thứ tự đó cho đến khi bạn nhận được kết quả mong muốn.

Mỗi giai đoạn của quy trình tổng hợp đều có toán tử MongoDB và tạo ra một hoặc nhiều tài liệu được chuyển đổi. Tùy thuộc vào truy vấn của bạn, một cấp độ có thể xuất hiện nhiều lần trong quy trình. Ví dụ: bạn có thể cần sử dụng các giai đoạn toán tử $count hoặc $sort nhiều lần trong quy trình tổng hợp.

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 của chúng trong Tài liệu MongoDB.

Hãy xác định một số cái được sử dụng phổ biến nhất dưới đây.

Giai đoạn $match

Giai đoạn này giúp bạn xác định các điều kiện lọc cụ thể trước khi bắt đầu các giai đoạn tổng hợp khác. Bạn có thể sử dụng nó để chọn dữ liệu phù hợp mà bạn muốn đưa vào quy trình tổng hợp.

  Truy cập công tắc WiFi, mạng và thông tin từ bất kỳ màn hình nào [Jailbreak]

Giai đoạn nhóm $

Giai đoạn nhóm phân tách dữ liệu thành các nhóm khác nhau dựa trên tiêu chí cụ thể bằng cách sử dụng các cặp khóa-giá trị. Mỗi nhóm đại diện cho một khóa trong tài liệu đầu ra.

Ví dụ: hãy xem xét dữ liệu mẫu bán hàng sau:

Bằng cách sử dụng quy trình tổng hợp, bạn có thể tính toán tổng doanh số bán hàng và doanh số bán hàng cao nhất cho từng nhóm sản phẩm:

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

Cặp _id: $Section nhóm tài liệu đầu ra dựa trên các phần. Bằng cách chỉ định các trường top_sale_count và top_sale, MongoDB tạo các khóa mới dựa trên hoạt động được xác định bởi trình tổng hợp; đây có thể là $sum, $min, $max hoặc $avg.

Giai đoạn $skip

Bạn có thể sử dụng giai đoạn $skip để bỏ qua một số lượng tài liệu được chỉ định trong đầu ra. Nó thường diễn ra sau vòng bảng. Ví dụ: nếu bạn mong đợi hai tài liệu đầu ra nhưng bỏ qua một tài liệu thì việc tổng hợp sẽ chỉ xuất ra tài liệu thứ hai.

Để thêm giai đoạn bỏ qua, hãy chèn thao tác $skip vào quy trình tổng hợp:

 ...,
{
    $skip: 1
  },

Giai đoạn sắp xếp $

Giai đoạn sắp xếp cho phép bạn sắp xếp dữ liệu theo thứ tự giảm dần hoặc tăng dần. Ví dụ: chúng ta có thể sắp xếp thêm dữ liệu trong ví dụ truy vấn trước đó theo thứ tự giảm dần để xác định phần nào có doanh số cao nhất.

Thêm toán tử $sort vào truy vấn trước đó:

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

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

Thao tác giới hạn giúp giảm số lượng tài liệu đầu ra mà bạn muốn đường dẫn tổng hợp hiển thị. Ví dụ: sử dụng toán tử $limit để lấy phần có doanh số cao nhất được trả về ở giai đoạn trước:

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

{"$limit": 1}

Ở trên chỉ trả về tài liệu đầu tiên; đây là phần có doanh thu cao nhất vì nó xuất hiện ở đầu sản phẩm được sắp xếp.

  Cách thiết lập và sử dụng iMessage trên máy Mac

Giai đoạn dự án $

Giai đoạn $project cho phép bạn định hình tài liệu đầu ra theo ý muốn. Bằng cách sử dụng toán tử $project, bạn có thể chỉ định trường nào sẽ đưa vào đầu ra và tùy chỉnh tên khóa của nó.

Chẳng hạn, một đầu ra mẫu không có giai đoạn $project trông như sau:

Hãy xem giai đoạn $project trông như thế nào. Để thêm dự án $ vào quy trình:

 ...,

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

        }
    }

Vì trước đây chúng tôi đã nhóm dữ liệu dựa trên các phần sản phẩm nên dữ liệu ở trên bao gồm từng phần sản phẩm trong tài liệu đầu ra. Nó cũng đảm bảo rằng số lượng bán hàng tổng hợp và tính năng bán hàng hàng đầu trong đầu ra là TotalSold và TopSale.

Đầu ra cuối cùng sạch hơn rất nhiều so với đầu ra trước đó:

Giai đoạn thư giãn $

Giai đoạn $unwind chia nhỏ một mảng trong tài liệu thành các tài liệu riêng lẻ. Lấy dữ liệu Đơn hàng sau đây làm ví dụ:

Sử dụng giai đoạn $unwind để giải cấu trúc mảng vật phẩm trước khi áp dụng các giai đoạn tổng hợp khác. Ví dụ: việc hủy bỏ mảng mặt hàng sẽ có ý nghĩa nếu bạn muốn tính tổng doanh thu cho từng sản phẩm:

 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",

        }
    }
])

Đây là kết quả của truy vấn tổng hợp ở trên:

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

Mặc dù quy trình tổng hợp bao gồm một số thao tác, nhưng các giai đoạn nổi bật trước đó sẽ cung cấp cho bạn ý tưởng về cách áp dụng chúng trong quy trình, bao gồm cả truy vấn cơ bản cho từng thao tác.

  10 lý do tại sao thiết kế theo thang độ xám sẽ cải thiện thiết kế UX/UI của bạn

Sử dụng mẫu dữ liệu bán hàng trước đó, chúng ta hãy tổng hợp một số giai đoạn được thảo luận ở trên để có cái nhìn rộng hơn về quy trình tổng hợp:

 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",

        }
    }
    
])

Kết quả cuối cùng trông giống như kết quả bạn đã thấy trước đây:

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

Cho đến khi ngừng sử dụng kể từ MongoDB 5.0, cách thông thường để tổng hợp dữ liệu trong MongoDB là thông qua MapReduce. Mặc dù MapReduce có các ứng dụng rộng hơn ngoài MongoDB, nhưng nó kém hiệu quả hơn so với quy trình tổng hợp, yêu cầu tập lệnh của bên thứ ba phải viết các chức năng bản đồ và thu gọn riêng biệt.

Mặt khác, đường dẫn tổng hợp chỉ dành riêng cho MongoDB. Nhưng nó cung cấp một cách sạch hơn và hiệu quả hơn để thực hiện các truy vấn phức tạp. Bên cạnh tính đơn giản và khả năng mở rộng truy vấn, các giai đoạn quy trình đặc trưng giúp đầu ra có thể tùy chỉnh nhiều hơn.

Có nhiều điểm khác biệt hơn giữa quy trình tổng hợp và MapReduce. Bạn sẽ thấy chúng khi chuyển từ MapReduce sang quy trình tổng hợp.

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

Truy vấn của bạn phải hiệu quả nhất có thể nếu bạn muốn chạy các phép tính chuyên sâu trên dữ liệu phức tạp trong MongoDB. Đường dẫn tổng hợp là lý tưởng cho truy vấn nâng cao. Thay vì thao tác dữ liệu trong các hoạt động riêng biệt, thường làm giảm hiệu suất, việc tổng hợp cho phép bạn gói tất cả chúng vào trong một quy trình hiệu suất duy nhất và thực thi chúng một lần.

Mặc dù quy trình tổng hợp hiệu quả hơn MapReduce nhưng bạn có thể thực hiện việc tổng hợp nhanh hơn và hiệu quả hơn bằng cách lập chỉ mục dữ liệu của mình. Điều này giới hạn lượng dữ liệu MongoDB cần quét trong mỗi giai đoạn tổng hợp.

x