Anda dapat melakukan operasi mapReduce ini.
Pertama pembuat peta:
var mapper = function () {
if ( this.flag == true ) {
totalCount++;
} else {
totalCount = 0;
}
if ( totalCount != 0 ) {
emit (
counter,
{ _id: this._id, totalCount: totalCount }
);
} else {
counter++;
}
};
Yang terus menghitung total waktu yang true
nilai terlihat di bendera. Jika hitungan itu lebih dari 1 maka kita keluarkan nilainya, juga berisi dokumen _id
. Penghitung lain yang digunakan untuk kunci bertambah ketika bendera false
, agar memiliki "kunci" pengelompokan untuk kecocokan.
Kemudian peredam:
var reducer = function ( key, values ) {
var result = { docs: [] };
values.forEach(function(value) {
result.docs.push(value._id);
result.totalCount = value.totalCount;
});
return result;
};
Cukup tekan _id
nilai ke array hasil bersama dengan totalCount.
Kemudian jalankan:
db.people.mapReduce(
mapper,
reducer,
{
"out": { "inline": 1 },
"scope": {
"totalCount": 0,
"counter": 0
},
"sort": { "updated_at": 1 }
}
)
Jadi dengan mapper
dan reducer
fungsi, kami kemudian mendefinisikan variabel global yang digunakan dalam "lingkup" dan meneruskan "sort" yang diperlukan pada updated_at
tanggal. Yang memberikan hasilnya:
{
"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,
}
Tentu saja Anda bisa melewati totalCount
variabel dan cukup gunakan panjang array, yang akan sama. Tapi karena kamu ingin menggunakan penghitung itu, itu hanya ditambahkan. Tapi begitulah prinsipnya.
Jadi ya, ini adalah masalah yang cocok untuk mapReduce, dan sekarang Anda memiliki contohnya.