Bạn có thể thực hiện thao tác mapReduce này.
Đầu tiên người lập bản đồ:
var mapper = function () {
if ( this.flag == true ) {
totalCount++;
} else {
totalCount = 0;
}
if ( totalCount != 0 ) {
emit (
counter,
{ _id: this._id, totalCount: totalCount }
);
} else {
counter++;
}
};
Điều này giữ số lượng đang chạy trong tổng số lần true
giá trị được nhìn thấy trong cờ. Nếu số lượng đó nhiều hơn 1 thì chúng tôi phát ra giá trị, cũng chứa tài liệu _id
. Một bộ đếm khác được sử dụng cho khóa được tăng lên khi cờ false
, để có "khóa" nhóm cho các trận đấu.
Sau đó, bộ giảm tốc:
var reducer = function ( key, values ) {
var result = { docs: [] };
values.forEach(function(value) {
result.docs.push(value._id);
result.totalCount = value.totalCount;
});
return result;
};
Chỉ cần đẩy _id
các giá trị vào một mảng kết quả cùng với Tổng số.
Sau đó chạy:
db.people.mapReduce(
mapper,
reducer,
{
"out": { "inline": 1 },
"scope": {
"totalCount": 0,
"counter": 0
},
"sort": { "updated_at": 1 }
}
)
Vì vậy, với mapper
và reducer
các hàm, sau đó chúng tôi xác định các biến toàn cục được sử dụng trong "phạm vi" và chuyển vào "sắp xếp" được yêu cầu trên updated_at
ngày. Kết quả là:
{
"results" : [
{
"_id" : 1,
"value" : {
"docs" : [
3,
4
],
"totalCount" : 2
}
},
{
"_id" : 2,
"value" : {
"docs" : [
7,
8,
5
],
"totalCount" : 3
}
}
],
"timeMillis" : 2,
"counts" : {
"input" : 7,
"emit" : 5,
"reduce" : 2,
"output" : 2
},
"ok" : 1,
}
Tất nhiên, bạn chỉ có thể bỏ qua totalCount
và chỉ sử dụng độ dài mảng, sẽ giống nhau. Nhưng vì bạn vẫn muốn sử dụng bộ đếm đó, nó chỉ được thêm vào. Nhưng đó là nguyên tắc.
Vì vậy, có, đây là một vấn đề phù hợp với mapReduce và bây giờ bạn có một ví dụ.