MongoDB - Giảm bản đồ
Theo tài liệu MongoDB, Map-reducelà một mô hình xử lý dữ liệu để cô đọng khối lượng lớn dữ liệu thành các kết quả tổng hợp hữu ích. MongoDB sử dụngmapReducelệnh cho các hoạt động thu nhỏ bản đồ. MapReduce thường được sử dụng để xử lý các tập dữ liệu lớn.
Lệnh MapReduce
Sau đây là cú pháp của lệnh mapReduce cơ bản:
>db.collection.mapReduce(
function() {emit(key,value);}, //map function
function(key,values) {return reduceFunction}, { //reduce function
out: collection,
query: document,
sort: document,
limit: number
}
)
Trước tiên, hàm map-Reduce sẽ truy vấn bộ sưu tập, sau đó ánh xạ các tài liệu kết quả để tạo ra các cặp khóa-giá trị, sau đó được giảm bớt dựa trên các khóa có nhiều giá trị.
Trong cú pháp trên -
map là một hàm javascript ánh xạ một giá trị với một khóa và tạo ra một cặp khóa-giá trị
reduce là một hàm javascript để giảm hoặc nhóm tất cả các tài liệu có cùng một khóa
out chỉ định vị trí của kết quả truy vấn thu nhỏ bản đồ
query chỉ định các tiêu chí lựa chọn tùy chọn để chọn tài liệu
sort chỉ định tiêu chí sắp xếp tùy chọn
limit chỉ định số lượng tài liệu tối đa tùy chọn sẽ được trả lại
Sử dụng MapReduce
Hãy xem xét cấu trúc tài liệu sau đây lưu trữ các bài đăng của người dùng. Tài liệu lưu trữ user_name của người dùng và trạng thái của bài đăng.
{
"post_text": "tutorialspoint is an awesome website for tutorials",
"user_name": "mark",
"status":"active"
}
Bây giờ, chúng ta sẽ sử dụng hàm mapReduce trên posts bộ sưu tập để chọn tất cả các bài đăng đang hoạt động, nhóm chúng dựa trên user_name và sau đó đếm số lượng bài đăng của mỗi người dùng bằng cách sử dụng mã 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 mapReduce ở trên xuất ra kết quả sau:
{
"result" : "post_total",
"timeMillis" : 9,
"counts" : {
"input" : 4,
"emit" : 4,
"reduce" : 2,
"output" : 2
},
"ok" : 1,
}
Kết quả cho thấy có tổng cộng 4 tài liệu phù hợp với truy vấn (trạng thái: "hoạt động"), hàm bản đồ phát ra 4 tài liệu có cặp khóa-giá trị và cuối cùng là hàm giảm các tài liệu được ánh xạ nhóm có cùng khóa thành 2.
Để xem kết quả của truy vấn mapReduce này, hãy 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 cho kết quả sau cho biết rằng cả hai người dùng tom và mark có hai bài đăng ở trạng thái hoạt động -
{ "_id" : "tom", "value" : 2 }
{ "_id" : "mark", "value" : 2 }
Theo cách tương tự, các truy vấn MapReduce có thể được sử dụng để xây dựng các truy vấn tổng hợp phức tạp lớn. Việc sử dụng các hàm Javascript tùy chỉnh làm cho việc sử dụng MapReduce rất linh hoạt và mạnh mẽ.