Aggregate trong MongoDB là một công cụ mạnh mẽ để truy vấn và xử lý dữ liệu từ các tài liệu MongoDB. Nó cho phép bạn thực hiện các hoạt động như tổng hợp, nhóm, tính trung bình và đếm các tài liệu trong một bộ sưu tập.

Các thao tác aggregate được thực hiện bằng cách sử dụng một ống đường dẫn mà các tài liệu sẽ được chuyển qua để thực hiện các phép toán. Các phép toán này được gọi là các pha và được xác định bằng các đối tượng JSON.

$match

$match là một pha trong các phương thức Aggregate của MongoDB, được sử dụng để lọc các tài liệu trong một bộ sưu tập dựa trên các điều kiện nhất định.

Ví dụ, để tìm tất cả các tài liệu trong bộ sưu tập “products” có giá trị “price” lớn hơn 100, bạn có thể sử dụng phương thức $match như sau:

db.products.aggregate([
   { $match: { price: { $gt: 100 } } }
])

Ở đây, phương thức $match sử dụng điều kiện { price: { $gt: 100 } } để lọc các tài liệu trong bộ sưu tập. Cụ thể, điều kiện này chỉ lấy các tài liệu có giá trị trường “price” lớn hơn 100.

$unwind

$unwind là một trong những pha trong các phương thức Aggregate của MongoDB, được sử dụng để giải nén các trường dạng mảng trong các tài liệu để tạo ra các bản sao của các tài liệu tương ứng. Khi một trường dạng mảng chứa nhiều giá trị, việc giải nén nó sẽ tạo ra các tài liệu mới, mỗi tài liệu sẽ có một giá trị riêng trong trường đó.

Ví dụ, giả sử bạn có một bộ sưu tập “orders” chứa các tài liệu về các đơn hàng và mỗi tài liệu chứa một trường “items” là một mảng các sản phẩm trong đơn hàng đó. Để giải nén trường “items” để tạo ra một tài liệu mới cho mỗi sản phẩm trong mỗi đơn hàng, bạn có thể sử dụng phương thức $unwind như sau:

db.orders.aggregate([
   { $unwind: "$items" }
])

Ở đây, phương thức $unwind được sử dụng để giải nén trường “items” trong tất cả các tài liệu trong bộ sưu tập “orders”. Kết quả trả về sẽ là một danh sách các tài liệu mới, mỗi tài liệu tương ứng với một sản phẩm trong mỗi đơn hàng.

Bạn cũng có thể sử dụng phương thức $unwind để giải nén các trường dạng mảng có mức độ lồng nhau. Ví dụ:

db.orders.aggregate([
   { $unwind: "$items" },
   { $unwind: "$items.details" }
])

Ở đây, trường “items” là một mảng các sản phẩm, và mỗi sản phẩm lại có một trường “details” là một mảng các chi tiết sản phẩm. Phương thức $unwind được sử dụng hai lần để giải nén cả hai trường, tạo ra một danh sách các tài liệu mới, mỗi tài liệu tương ứng với một chi tiết sản phẩm trong mỗi sản phẩm trong mỗi đơn hàng.

$group

$group là một trong những pha trong các phương thức Aggregate của MongoDB, được sử dụng để nhóm các tài liệu trong một bộ sưu tập dựa trên các trường khác nhau và tính toán các giá trị thống kê trên các nhóm đó.

Ví dụ, để nhóm các tài liệu trong bộ sưu tập “sales” theo trường “customer” và tính tổng số tiền được bán cho mỗi khách hàng, bạn có thể sử dụng phương thức $group như sau:

db.sales.aggregate([
   { $group: { _id: "$customer", totalSales: { $sum: "$amount" } } }
])

Ở đây, phương thức $group sử dụng trường “customer” để nhóm các tài liệu trong bộ sưu tập “sales”. Đối số “_id” được sử dụng để chỉ định trường để nhóm theo, và “$customer” là trường được chọn. Phương thức $sum được sử dụng để tính tổng số tiền được bán trong mỗi nhóm, và được đặt tên là “totalSales”.

Kết quả trả về sẽ là một danh sách các nhóm được tạo ra theo trường “customer”, và cho biết tổng số tiền được bán cho mỗi khách hàng.

Bạn cũng có thể sử dụng nhiều trường để nhóm các tài liệu và tính toán các giá trị thống kê trên các nhóm đó. Ví dụ:

db.sales.aggregate([
   { $group: { 
       _id: { customer: "$customer", product: "$product" },
       totalSales: { $sum: "$amount" } 
   } }
])

Ở đây, phương thức $group sử dụng hai trường “customer” và “product” để nhóm các tài liệu trong bộ sưu tập “sales”. Trường “_id” được sử dụng để chỉ định các trường được nhóm theo, và { customer: “$customer”, product: “$product” } là một đối tượng JSON chứa các trường được chọn. Phương thức $sum được sử dụng để tính tổng số tiền được bán trong mỗi nhóm, và được đặt tên là “totalSales”.

$project

$project là một trong những toán tử trong phương thức Aggregate của MongoDB, được sử dụng để chọn các trường dữ liệu cần trả về và định dạng lại cấu trúc của các tài liệu trong kết quả truy vấn.

Phương thức $project sử dụng cú pháp như sau:$project là một trong những toán tử trong phương thức Aggregate của MongoDB, được sử dụng để chọn các trường dữ liệu cần trả về và định dạng lại cấu trúc của các tài liệu trong kết quả truy vấn.

Phương thức $project sử dụng cú pháp như sau:

db.collection.aggregate([
   { $project: { <field1>: <1 or 0>, <field2>: <1 or 0>, ... } }
])

Ở đây, bạn cần chỉ định các trường dữ liệu mà bạn muốn trả về trong kết quả truy vấn. Với mỗi trường dữ liệu, bạn có thể chỉ định giá trị 1 để bao gồm trường đó trong kết quả truy vấn hoặc giá trị 0 để loại bỏ trường đó khỏi kết quả truy vấn. Ngoài ra, bạn cũng có thể định dạng lại cấu trúc của các tài liệu trong kết quả truy vấn bằng cách sử dụng các toán tử như $addFields, $concat, $multiply, $substr, v.v.

Ví dụ, giả sử bạn có một bộ sưu tập “employees” chứa các tài liệu về các nhân viên và bạn muốn truy vấn danh sách tên, tuổi và lương của các nhân viên. Để chỉ trả về các trường “name”, “age” và “salary”, bạn có thể sử dụng phương thức $project như sau:

db.employees.aggregate([
   { $project: { name: 1, age: 1, salary: 1 } }
])

Ở đây, phương thức $project chỉ định ba trường “name”, “age” và “salary” và giá trị 1 để bao gồm chúng trong kết quả truy vấn.

Bạn cũng có thể sử dụng phương thức $project để định dạng lại cấu trúc của các tài liệu trong kết quả truy vấn. Ví dụ:

db.employees.aggregate([
   { $project: { fullName: { $concat: [ "$firstName", " ", "$lastName" ] }, age: 1, salary: 1 } }
])

Ở đây, phương thức $project tạo ra một trường “fullName” mới bằng cách ghép nối trường “firstName” và “lastName” bằng toán tử $concat. Kết quả truy vấn sẽ chứa các trường “fullName”, “age” và “salary”.

$lookup

$lookup là một trong những toán tử trong phương thức Aggregate của MongoDB, được sử dụng để thực hiện join giữa hai hoặc nhiều bảng trong cùng một cơ sở dữ liệu. Phương thức $lookup cho phép bạn thực hiện join giữa bảng chứa các tài liệu cha và bảng chứa các tài liệu con, và tạo ra kết quả truy vấn chứa các tài liệu đã được ghép nối.

Cú pháp của phương thức $lookup như sau:

db.collection.aggregate([ 
    { $lookup: 
        { 
           from: <collection to join>, 
           localField: <field from the input documents>, 
           foreignField: <field from the documents of the "from" collection>,
           as: <output array field> 
         } 
    } 
])

Ở đây, bạn cần chỉ định các thông số sau:

  • from: Tên của bảng mà bạn muốn join với bảng hiện tại.
  • localField: Trường trong tài liệu của bảng hiện tại, được sử dụng để join với trường trong tài liệu của bảng “from”.
  • foreignField: Trường trong tài liệu của bảng “from”, được sử dụng để join với trường trong tài liệu của bảng hiện tại.
  • as: Tên của trường trong tài liệu kết quả, sẽ chứa kết quả join.

Ví dụ, giả sử bạn có hai bảng “orders” và “customers” trong cùng một cơ sở dữ liệu, và bạn muốn join hai bảng này để tạo ra một danh sách đơn hàng với thông tin về khách hàng tương ứng. Bảng “orders” chứa các tài liệu về các đơn hàng, bao gồm trường “customer_id” chứa mã khách hàng, và bảng “customers” chứa các tài liệu về các khách hàng, bao gồm trường “id” chứa mã khách hàng.

Để join hai bảng này, bạn có thể sử dụng phương thức $lookup như sau:

db.orders.aggregate([
   {
      $lookup:
         {
           from: "customers",
           localField: "customer_id",
           foreignField: "id",
           as: "customer_info"
         }
   }
])

Ở đây, phương thức $lookup join bảng “customers” với bảng “orders” dựa trên trường “customer_id” của bảng “orders” và trường “id” của bảng “customers”. Kết quả truy vấn sẽ chứa một trường “customer_info” mới, chứa thông tin về khách hàng tương ứng với mỗi đơn hàng.

Phương thức $lookup trong MongoDB cung cấp nhiều tùy chọn để tùy chỉnh cách join giữa các bảng, bao gồm các tùy chọn để lọc các tài liệu trong bảng.

$sort

$sort là một trong những toán tử trong phương thức Aggregate của MongoDB, được sử dụng để sắp xếp kết quả truy vấn theo một trường hoặc nhiều trường trong tài liệu.

Cú pháp của phương thức $sort như sau:

db.collection.aggregate([
   { $sort : { <field1> : <sort order>, <field2>: <sort order> ... } }
])

Ở đây, bạn cần chỉ định các thông số sau:

  • <field1>, <field2>,… : Tên các trường trong tài liệu muốn sắp xếp.
  • <sort order>: Có thể là 1 hoặc -1, tương ứng với sắp xếp tăng dần (ascending) hoặc giảm dần (descending) theo trường tương ứng.

Ví dụ, giả sử bạn có một bảng “students” chứa các tài liệu về các sinh viên, bao gồm trường “name” chứa tên sinh viên và trường “score” chứa điểm số của sinh viên. Bạn muốn sắp xếp danh sách sinh viên theo điểm số giảm dần. Để làm điều này, bạn có thể sử dụng phương thức $sort như sau:

db.students.aggregate([
   { $sort : { score : -1 } }
])

Ở đây, phương thức $sort sẽ sắp xếp danh sách sinh viên trong bảng “students” theo trường “score” giảm dần, và trả về kết quả truy vấn tương ứng.

Phương thức $sort cũng hỗ trợ sắp xếp theo nhiều trường, sử dụng cú pháp tương tự như trên. Ngoài ra, phương thức $sort cũng hỗ trợ sắp xếp theo thứ tự chữ cái (alphabetical order) và thứ tự ngược lại của chuỗi ký tự.

$limit

$limit là một trong những toán tử trong phương thức Aggregate của MongoDB, được sử dụng để giới hạn số lượng tài liệu trả về trong kết quả truy vấn.

Cú pháp của phương thức $limit như sau:

db.collection.aggregate([
   { $limit : <number> }
])

Ở đây, <number> là số lượng tài liệu tối đa mà bạn muốn trả về trong kết quả truy vấn.

Ví dụ, giả sử bạn có một bảng “students” chứa các tài liệu về các sinh viên, và bạn muốn lấy ra 10 tài liệu đầu tiên trong danh sách sinh viên. Để làm điều này, bạn có thể sử dụng phương thức $limit như sau:

db.students.aggregate([
   { $limit : 10 }
])

Ở đây, phương thức $limit sẽ giới hạn số lượng tài liệu trả về trong bảng “students” là 10, và trả về kết quả truy vấn tương ứng.

Lưu ý rằng, phương thức $limit thường được sử dụng kết hợp với các phương thức khác như $sort hoặc $skip để giới hạn số lượng tài liệu trả về từ một danh sách tài liệu lớn hơn.

$skip

$skip là một trong những toán tử trong phương thức Aggregate của MongoDB, được sử dụng để bỏ qua một số lượng tài liệu trong danh sách truy vấn.

Cú pháp của phương thức $skip như sau:

db.collection.aggregate([
   { $skip : <number> }
])

Ở đây, <number> là số lượng tài liệu đầu tiên mà bạn muốn bỏ qua trong danh sách truy vấn.

Ví dụ, giả sử bạn có một bảng “students” chứa các tài liệu về các sinh viên, và bạn muốn lấy ra danh sách sinh viên từ tài liệu thứ 11 trở đi. Để làm điều này, bạn có thể sử dụng phương thức $skip như sau:

db.students.aggregate([
   { $skip : 10 }
])

Ở đây, phương thức $skip sẽ bỏ qua 10 tài liệu đầu tiên trong bảng “students”, và trả về danh sách sinh viên từ tài liệu thứ 11 trở đi.

Một số toán tử

$sum

$sum được sử dụng để tính toán tổng các giá trị trong một trường. Ví dụ, để tính tổng số tiền đã bán trong tất cả các đơn hàng trong bộ sưu tập “orders”, bạn có thể sử dụng phương thức $sum như sau:

db.orders.aggregate([
   { $group: { _id: null, totalAmount: { $sum: "$amount" } } }
])

Bạn có thể sử dụng $sum để tính tổng số lượng các phần tử trong một nhóm:

db.sales.aggregate([
   { $group: { 
       _id: { customer: "$customer", product: "$product" },
       count: { $sum: 1 } 
   } }
])

$push

Trong phương thức $group của MongoDB, bạn cũng có thể sử dụng toán tử $push để tạo ra một mảng mới và thêm các giá trị vào mảng đó dựa trên nhóm tài liệu.

Cú pháp của toán tử $push trong $group như sau:

{
  $group: {
    _id: <expression>,
    <new_field>: { $push: <expression> }
  }
}

Ở đây:

  • _id: Được sử dụng để nhóm các tài liệu theo giá trị của trường hoặc biểu thức được chỉ định.
  • <new_field>: Tên của trường mới được tạo ra trong kết quả nhóm, đại diện cho mảng chứa các giá trị được thêm vào.
  • <expression>: Biểu thức để lựa chọn hoặc chuyển đổi giá trị trong tài liệu trước khi thêm vào mảng.

Ví dụ, giả sử bạn có một bảng “students” chứa các tài liệu về các sinh viên, bao gồm trường “name” chứa tên sinh viên và trường “subject” chứa môn học. Bạn muốn nhóm các sinh viên theo tên và tạo ra một mảng chứa các môn học mà sinh viên đã đăng ký. Để làm điều này, bạn có thể sử dụng toán tử $push trong $group như sau:

db.students.aggregate([
  {
    $group: {
      _id: "$name",
      subjects: { $push: "$subject" }
    }
  }
])

$hour

Trong phương thức $group của MongoDB, bạn có thể sử dụng toán tử $hour để trích xuất giờ từ trường kiểu ngày/giờ trong tài liệu và sử dụng nó trong phép nhóm.

Cú pháp của toán tử $hour trong $group như sau:

{
  $group: {
    _id: { $hour: <dateExpression> },
    <field>: { <accumulator> : <expression> }
  }
}

Ở đây, <dateExpression> là một biểu thức đại diện cho trường kiểu ngày/giờ trong tài liệu. Toán tử $hour sẽ trích xuất giờ từ trường này để sử dụng làm giá trị _id cho nhóm.

Ví dụ, giả sử bạn có một bảng “events” chứa các tài liệu về sự kiện, bao gồm trường “timestamp” (thời điểm) và trường “count” (số lượng). Bạn muốn nhóm các sự kiện theo giờ trong ngày và tính tổng số lượng sự kiện trong mỗi giờ. Để làm điều này, bạn có thể sử dụng toán tử $hour trong $group như sau:

db.events.aggregate([
  {
    $group: {
      _id: { $hour: {
           date: "$timestamp",
           timezone: "Asia/Ho_Chi_Minh"
      } },
      total: { $sum: "$count" }
    }
  }
])

Trong ví dụ này, tài liệu sẽ được nhóm theo giờ trong ngày. Toán tử $hour được sử dụng trong _id để trích xuất giờ từ trường “timestamp”. Tổng số lượng sự kiện trong mỗi giờ sẽ được tính bằng toán tử $sum trên trường “count” và gán cho trường “total” trong kết quả nhóm.

Kết quả truy vấn sẽ chứa các tài liệu nhóm mới, trong đó trường _id chứa giờ tương ứng và trường “total” chứa tổng số lượng sự kiện trong mỗi giờ.

Lưu ý rằng trường “timestamp” trong tài liệu phải có kiểu dữ liệu ngày/giờ (date/time) để toán tử $hour hoạt động chính xác.

Leave a Reply

Your email address will not be published. Required fields are marked *