MapReduce có thể là một lựa chọn phù hợp có thể xử lý tài liệu trên máy chủ mà không cần thao tác trên máy khách (vì không có tính năng tách chuỗi trên máy chủ DB (sự cố mở).
Bắt đầu với map
hàm số. Trong ví dụ dưới đây (có thể cần phải mạnh mẽ hơn), mỗi tài liệu được chuyển đến map
function (as this
). Mã tìm kiếm summary
và nếu nó ở đó, hãy viết thường nó, phân chia trên một khoảng trắng, sau đó phát ra một 1
cho mỗi từ được tìm thấy.
var map = function() {
var summary = this.summary;
if (summary) {
// quick lowercase to normalize per your requirements
summary = summary.toLowerCase().split(" ");
for (var i = summary.length - 1; i >= 0; i--) {
// might want to remove punctuation, etc. here
if (summary[i]) { // make sure there's something
emit(summary[i], 1); // store a 1 for each word
}
}
}
};
Sau đó, trong reduce
, nó tổng hợp tất cả các kết quả được tìm thấy bởi map
hàm và trả về tổng số rời rạc cho mỗi từ được emit
ted ở trên.
var reduce = function( key, values ) {
var count = 0;
values.forEach(function(v) {
count +=v;
});
return count;
}
Cuối cùng, thực hiện mapReduce:
> db.so.mapReduce(map, reduce, {out: "word_count"})
Kết quả với dữ liệu mẫu của bạn:
> db.word_count.find().sort({value:-1})
{ "_id" : "is", "value" : 3 }
{ "_id" : "bad", "value" : 2 }
{ "_id" : "good", "value" : 2 }
{ "_id" : "this", "value" : 2 }
{ "_id" : "neither", "value" : 1 }
{ "_id" : "or", "value" : 1 }
{ "_id" : "something", "value" : 1 }
{ "_id" : "that", "value" : 1 }