Đây là điều không thể thực hiện được với khung tổng hợp và phương thức MongoDB hiện tại duy nhất có sẵn cho loại hoạt động này là mapReduce.
Lý do là khung tổng hợp không có cách nào tham chiếu đến bất kỳ tài liệu nào khác trong quy trình hơn tài liệu hiện tại. Điều này thực sự cũng áp dụng cho các giai đoạn của quy trình "nhóm", vì mặc dù mọi thứ được nhóm trên một "khóa", bạn không thể thực sự xử lý các tài liệu riêng lẻ theo cách bạn muốn.
Mặt khác, MapReduce có sẵn một tính năng cho phép bạn làm những gì bạn muốn ở đây và nó thậm chí không liên quan trực tiếp đến việc tổng hợp. Trên thực tế, đó là khả năng có "các biến phạm vi toàn cầu" trên tất cả các giai đoạn. Và có một "biến" để "lưu trữ tài liệu cuối cùng" về cơ bản là tất cả những gì bạn cần để đạt được kết quả của mình.
Vì vậy, nó là mã khá đơn giản và thực tế là không cần "giảm":
db.collection.mapReduce(
function () {
if (lastVal != null)
emit( this._id, this.val - lastVal );
lastVal = this.val;
},
function() {}, // mapper is not called
{
"scope": { "lastVal": null },
"out": { "inline": 1 }
}
)
Điều này mang lại cho bạn một kết quả giống như thế này:
{
"results" : [
{
"_id" : ObjectId("54a425a99b8bcd6f73e2d662"),
"value" : 2
},
{
"_id" : ObjectId("54a425a99b8bcd6f73e2d663"),
"value" : 3
},
{
"_id" : ObjectId("54a425a99b8bcd6f73e2d664"),
"value" : 4
}
],
"timeMillis" : 3,
"counts" : {
"input" : 4,
"emit" : 3,
"reduce" : 0,
"output" : 3
},
"ok" : 1
}
Đó thực sự chỉ là chọn "thứ gì đó độc đáo" dưới dạng _id
được phát ra giá trị hơn là bất cứ điều gì cụ thể, bởi vì tất cả những gì điều này thực sự đang làm là sự khác biệt giữa các giá trị trên các tài liệu khác nhau.
Các biến toàn cục thường là giải pháp cho các kiểu tổng hợp "ghép nối" này hoặc tạo ra "các tổng đang chạy". Ngay bây giờ, khung tổng hợp không có quyền truy cập vào các biến toàn cục, mặc dù nó có thể là một điều tuyệt vời khi có. Khung mapReduce có chúng, vì vậy có lẽ công bằng khi nói rằng chúng cũng nên có sẵn cho khung tổng hợp.
Ngay bây giờ họ không mặc dù vậy, vì vậy hãy gắn bó với mapReduce.