Trong quá trình học, bạn có thể đã bỏ lỡ trang hướng dẫn chính trên mapReduce . Có một mảnh quan trọng thông tin mà bạn đã bỏ lỡ hoặc chưa đọc và học:
Và sau đó một chút:
Vì vậy, về cơ bản điều đó có nghĩa là bởi vì "bộ giảm tốc" không thực sự xử lý "tất cả" tất cả các khóa duy nhất cùng một lúc, nên nó mong đợi "đầu vào" giống như "đầu ra", vì đầu ra đó có thể được đưa trở lại bộ giảm tốc một lần nữa.
Vì lý do tương tự, "người lập bản đồ" cần xuất ra chính xác những gì được mong đợi là đầu ra của "bộ giảm tốc", cũng là "đầu vào" của bộ giảm tốc. Vì vậy, bạn không thực sự "thay đổi" cấu trúc dữ liệu mà chỉ cần "giảm" nó.
db.Cool.mapReduce(
function(){emit(this.id, { "cools": [this.cool] })},
function(key, values){
var res = [];
values.forEach(function(cool){
cool.cools.forEach(function(v) {
res.push(v);
});
});
return {cools: res};
},
{out: "MapReduce"}
)
Bây giờ bạn đang xử lý đầu vào dưới dạng một mảng cũng là đầu ra, sau đó kết quả mong đợi sẽ được trả về.
Điều tiếp theo cần tìm hiểu là trong hầu hết trường hợp mapReduce không thực sự là thứ bạn muốn sử dụng và bạn nên sử dụng khung tổng hợp thay vào đó.
Trái ngược với mapReduce, điều này sử dụng các toán tử "được mã hóa tự nhiên" và không cần thông dịch JavaScript để chạy. Và điều đó phần lớn có nghĩa là nó "nhanh hơn" và thường đơn giản hơn rất nhiều trong việc xây dựng.
Đây là thao tác tương tự với .aggregate()
:
db.Cool.aggregate([
{ "$group": {
"_id": "$id",
"cools": { "$push": "$cool" }
}}
])
Tương tự, mã hóa ít hơn và nhanh hơn rất nhiều.
Đi ra ngoài bộ sưu tập khác mà bạn sử dụng $out
:
db.Cool.aggregate([
{ "$group": {
"_id": "$id",
"cools": { "$push": "$cool" }
}},
{ "$out": "reduced" }
])
Đối với bản ghi, đây là đầu ra mapReduce:
{ "_id" : "a", "value" : { "cools" : [ "a1", "a2" ] } }
{ "_id" : "b", "value" : { "cools" : [ "b1", "b2" ] } }
{ "_id" : "c", "value" : { "cools" : [ "c1" ] } }
{ "_id" : "d", "value" : { "cools" : [ "d1" ] } }
Và tổng sản lượng. Với sự khác biệt duy nhất từ mapReduce _id
và giá trị value
đầu ra điên rồ là các khóa bị đảo ngược, vì $group
không đảm bảo một đơn đặt hàng (nhưng thường được coi là một ngăn xếp ngược lại):
{ "_id" : "d", "cools" : [ "d1" ] }
{ "_id" : "c", "cools" : [ "c1" ] }
{ "_id" : "b", "cools" : [ "b1", "b2" ] }
{ "_id" : "a", "cools" : [ "a1", "a2" ] }