Trong MongoDB, phương thức db.collection.mapReduce() là một lệnh bao bọc lệnh Map Reduce. Nó được sử dụng để cô đọng một khối lượng lớn dữ liệu thành các kết quả tổng thể có ích. Về tổng thể, Map Reduce trong MongoDB được sử dụng để xử lý các dữ liệu lớn. Dưới đây là một số chia sẻ của Stringee về tính năng hữu ích này trong MongoDB.

1. Lệnh Map Reduce trong MongoDB

Cú pháp cơ bản của lệnh Map Reduce như sau:

>db.collection.mapReduce(
   function() {emit(key,value);},  //map function
   function(key,values) {return reduceFunction},   //reduce function
   {
      out: collection,
      query: document,
      sort: document,
      limit: number
   }
)

Đầu tiên, hàm (function) của Map Reduce truy vấn Collection, sau đó ánh xạ các Document kết quả để phát xạ (emit) các cặp key-value mà sau đó bị rút gọn dựa trên các key có nhiều value.

Trong cú pháp trên:

  • map là một hàm JavaScript mà ánh xạ một value với một key và phát xạ một cặp key-value.
  • reduce là một hàm JavaScript mà rút gọn hoặc nhóm tất cả Document có cùng key.
  • out xác định vị trí của kết quả truy vấn Map Reduce.
  • query xác định tiêu chuẩn chọn tùy ý để lựa chọn các Document.
  • sort xác định tiêu chuẩn sắp xếp tùy ý.
  • limit xác định số lượng Document tối đa tùy ý để được trả về.

2. Map Reduce hoạt động như thế nào trong MongoDB?

Trong MongoDB, Map Reduce thực hiện một phương thức JavaScript để thực hiện map, tính toán một giá trị vào thành một khóa. Nếu một khóa có nhiều giá trị để map vào, quá trình này sẽ giảm số giá trị của khóa về thành một đối tượng.

Việc sử dụng các phương thức được tùy chỉnh của JavaScript mang lại sự linh hoạt cho Map Reduce. Ví dụ như khi chúng ta thực hiện các phép toán trên một document, phương thức map có thể tạo ra nhiều hơn một khóa và giá trị có mapping hoặc không có mapping. Function này còn có thể sử dụng các phương thức JavaScript để tạo ra các chỉnh sửa cuối cùng cho các kết quả mà nó trả về trong giai đoạn cuối khi map và reduce được thực hiện, ở đây có thể kể đến các phép toán thêm.

3. Sử dụng Map Reduce trong MongoDB

Bạn theo dõi cấu trúc của Document để lưu giữ User Post. Document này lưu giữ user_name của người dùng và status của Post.

{
   "post_text": "tutorialspoint is an awesome website for tutorials",
   "user_name": "mark",
   "status":"active"
}

Bây giờ, chúng ta sẽ sử dụng một hàm Map Reduce trên các collection post để lựa chọn tất cả các active post, nhóm chúng lại dựa trên user_name và sau đó đếm số lượng post của mỗi user sử dụng code sau:

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
   function(key, values) {return Array.sum(values)}, 
      {  
         query:{status:"active"},  
         out:"post_total" 
      }
)

Truy vấn Map Reduce trên sẽ cho kết quả:

{
   "result" : "post_total",
   "timeMillis" : 9,
   "counts" : {
      "input" : 4,
      "emit" : 4,
      "reduce" : 2,
      "output" : 2
   },
   "ok" : 1,
}

Kết quả chỉ ra rằng, tổng số 4 document đã kết nối với truy vấn (status:"active"), hàm map phát xạ 4 Document với các cặp key-value và cuối cùng hàm reduce nhóm các Document đã ánh xạ có cùng key vào trong 2 document.

Để xem kết quả của truy vấn Map Reduce này, bạn sử dụng toán tử find:

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
   function(key, values) {return Array.sum(values)}, 
      {  
         query:{status:"active"},  
         out:"post_total" 
      }
).find()

Truy vấn trên cung cấp kết quả chỉ ra rằng cả hai người dùng Tom và Mark có hai post trong trạng thái là active.

{ "_id" : "Tom", "value" : 2 }
{ "_id" : "Mark", "value" : 2 }

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

- Tìm hiểu về ràng buộc (Constraint) trong SQL

- Monitoring trên K8s cluster với Prometheus và Grafana

- MongoDB là gì? Hiểu về cơ sở dữ liệu phi quan hệ MongoDB

4. Ví dụ về Map Reduce trong MongoDB 

Map Reduce có thể được sử dụng cho nhiều mục đích khác nhau bởi các tính năng nổi trội của nó, dưới đây là một số các trường hợp mà người ta hay sử dụng nó:

  • Xác định chức năng bản đồ.
  • Xác định chức năng giảm.
  • Thực hiện thao tác Map Reduce.
  • Xác minh kết quả bằng cách sử dụng sắp xếp.
  • Giới hạn sử dụng lệnh Map Reduce.

4.1. Xác định chức năng bản đồ

Chúng ta đã xác định chức năng bản đồ để xử lý từng câu lệnh từ bộ sưu tập.

Trong ví dụ dưới đây, chúng ta phải xác định tên hàm bản đồ là mapFun1:

var mapFun1 = function() {
emit(this.customer_address, this.price_of_product);
};

4.2. Xác định chức năng giảm

Chúng ta đã xác định hàm giảm để giảm đối tượng đơn lẻ từ tất cả các giá trị phương thức MongoDB Map Reduce. Ví dụ dưới đây cho thấy chức năng giảm như sau:

var reduceFun2 = function(keyCustomer_address, valuesprice_of_product) {
return Array. Sum(valuesprice_of_product);
};

4.3. Thực hiện thao tác Map Reduce

Sau khi tạo map và hàm reduce chúng ta thực hiện thao tác Map Reduce trên bảng order_test như sau:

db.order_test.mapReduce(mapFun1, reduceFun2, {
out: "Test_MapReduce_example" 
})

4.4. Xác minh kết quả bằng cách sử dụng sắp xếp

Chúng ta đã xác minh kết quả của lệnh Map Reduce bằng cách sử dụng sắp xếp như sau:

db.Test_MapReduce_example.find().sort({
 _id: 1 
} )

4.5. Giới hạn sử dụng Lệnh Map Reduce

Trong ví dụ bên dưới, chúng ta có giới hạn xác định bằng cách sử dụng lệnh Map Reduce trong MongoDB:

db.Test_MapReduce_example.find().limit (1)
db.Test_MapReduce_example.find().limit (2)

Kết luận

Trong MongoDB, các truy vấn Map Reduce có thể được sử dụng để xây dựng các truy vấn aggregation phức tạp. Sử dụng các hàm JavaScript tùy biến giúp cho việc sử dụng Map Reduce thêm linh động và mạnh mẽ hơn.


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: