Trong chuỗi bài viết trước về Elasticsearch, Stringee và các bạn đã cùng nhau tìm hiểu về các hàm cho phép thực hiện các tính toán (aggregation) với search engine này. Và đương nhiên, với một cơ sở dữ liệu document base mạnh mẽ như MongoDB, nó cũng sẽ có những sự hỗ trợ nhất định với kiểu phép toán này. Bài viết này sẽ là một vài chia sẻ của Stringee về cách sử dụng các hàm aggregation trong MongoDB nhé.

1. Tổng quan về các phương thức aggregation trong MongoDB

Các phương thức aggregations thao tác trên nhiều document và trả về một tập kết quả hoàn chỉnh. Chúng ta có thể sử dụng nó để thực hiện:

  • Gom các giá trị từ nhiều document
  • Thực hiện các phép toán trên một tập dữ liệu đã được nhóm lại và trả về một kết quả duy nhất
  • Phân tích dữ liệu theo một khoảng thời gian

Để thực hiện được các phép toán này, bạn sẽ cần sử dụng:

  • Một pipeline: một chuỗi kết hợp các phương thức để thực hiện phép tính toán
  • Một phương thức riêng lẻ: là một phương thức được tích hợp sẵn, đơn giản nhưng thiếu đi các tính năng mà một pipeline đầy đủ có thể cung cấp

Điểm mạnh của aggregation framework là:

  • Xử lý nhanh và mạnh mẽ với lượng ít băng thông
  • Giải quyết được các yêu cầu phức tạp
  • Có thể làm việc với dữ liệu lớn

2. Pipelines trong aggregation

Một aggregation pipeline bao gồm một hoặc nhiều bước thực hiện xử lý các document:

  • Mỗi bước thực hiện một phép toán lên document đầu vào, lấy ví dụ một stage có thể lọc các document, nhóm và tính toán các giá trị trên đó
  • Các documents là output từ bước trước đó sẽ được truyền vào stage tiếp theo để tiếp tục thực hiện
  • Một aggregation pipeline có thể trả về các kết quả cho một nhóm các document ví dụ như tổng, trung bình, max hay min

Lưu ý rằng pipeline chạy với db.collection.aggregate() không thay đổi các document trong collection ngoại trừ các pipeline có chứa các stage $merge hay $out

3. Một số pipeline và ví dụ

Cú pháp cơ bản để thực hiện một pipeline là:

db.collection.aggregate( <pipeline>, <options> )

Trong đó:

  • pipeline: một tuần tự các phương thức aggregate hoặc các stage
  • options: phần này không bắt buộc, nó là các options mà phương thức aggregate được truyền thêm

Các aggregation thường được sử dụng:

  • $match: được dùng để lọc các document theo một điều kiện nào đó. $match tương tự như WHERE và HAVING trong SQL. 
{ $match: { <query> } }

Cú pháp query của nó giống hoàn toàn với find():

db.orders.aggregate([
    { 
        $match: { 
            customer_id: "A123" 
        } 
    }
])
  • $project: được dùng để chỉ định các field sẽ xuất hiện trong output document. Đó có thể là các field đã tồn tại trong input document, hoặc cũng có thể là các field được tính toán mới. $project tương tự như SELECT trong SQL.

Cú pháp:

{ $project: { <specification(s)> } }

Ví dụ:

db.books.aggregate( [ { $project : { title : 1 , author : 1 } } ] )

>>> Xem thêm bài viết về MongoDB:

$count: mới xuất hiện trong MongoDB version 3.4. $count trả về thêm trong output một field X chứa tổng số input document.

Cú pháp:

{ $count: <string> }

Ví dụ:

db.collection.aggregate( [
   { $group: { _id: null, myCount: { $sum: 1 } } },
   { $project: { _id: 0 } }
] )
  • $limit và $skip: $limit được dùng để giới hạn số lượng output document. $skip được dùng để chỉ định số lượng document sẽ bị bỏ qua trong output (tính từ document đầu tiên). $limit và $skip tương tự như LIMIT và OFFSET trong SQL.

Cú pháp:

{ $limit: <positive 64-bit integer> }

{ $skip: <positive 64-bit integer> }

Ví dụ:

db.article.aggregate([
   { $limit : 5 }
]);
db.article.aggregate([
    { $skip : 5 }
]);
  • $sort: được dùng để sắp xếp các document trong output theo một tiêu chí nào đó. $sort tương tự như ORDER BY trong SQL.

Cú pháp:

{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }

Ví dụ:

db.restaurants.aggregate(
   [
     { $sort : { borough : 1 } }
   ]
)
  • $group: được dùng để gom nhóm các input document theo expression _id. Mỗi nhóm tương ứng với một output document. Trong $group, chúng ta có thể sử dụng các accumulator expression như $sum, $avg, $max, $min, …

Cú pháp:

{
 $group:
   {
     _id: <expression>, // Group key
     <field1>: { <accumulator1> : <expression1> },
     ...
   }
 }

Ví dụ:

db.foo.aggregate([
  {
    $sort:{ x : 1, y : 1 }
  },
  {
    $group: {
      _id: { x : "$x" },
      y: { $first : "$y" }
    }
  }
])

4. Các phương thức thực hiện các phép toán riêng lẻ

Mục đích của các phương thức này là thực hiện các tính toán trên một collection. Các phương thức tuy là đơn giản nhưng lại thiếu đi nhiều đặc điểm của một pipeline.

Phương thứcMô tả
db.collection.estimatedDocumentCount()Trả về một lượng xấp xỉ số lượng của một collection hoặc một view
db.collection.count()Trả về số lượng document trong một collection hoặc một view
db.collection.distinct()Trả về một mảng các document có những giá trị không trùng nhau dựa trên một field đã được chỉ định

 

Kết

Aggregation là một trong những tính năng nổi bật và quan trọng trong việc tính toán xử lý dữ liệu trong mongoDb mà hầu hết các hệ thống hiện nay đang dùng. Nắm vững Aggregation Framework khiến chúng ta dễ dàng thao tác xử lý một cách đơn giản data với MongoDB.


Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy,  Adavigo, bTaskee…

Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY: