Saya memiliki data di MongoDB. Struktur suatu objek adalah seperti ini:
{
"_id" : ObjectId("5395177980a6b1ccf916312c"),
"institutionId" : "831",
"currentObject" : {
"systemIdentifiers" : [
{
"value" : "24387",
"system" : "ABC"
}]
}
}
Saya harus mengetahui berapa banyak objek yang memiliki institutionId dan systemIdentifiers[0].value yang sama dan hanya ingin mengembalikan objek yang diduplikasi dengan cara itu. Untuk melakukan itu saya mengelompokkannya berdasarkan ID ini dan menghitung kejadiannya.
Objek (sepasang ID) harus dikembalikan ketika count lebih besar dari 1.
Ini adalah potongan kode yang dikelompokkan dengan menggunakan MapReduce.
var map = function() {
var key = this.institutionId;
var val = this.currentObject.systemIdentifiers[0].value;
emit({"institutionId":key,"workId":val}, {count:1});
};
var reduce = function(key, values) {
var count = 0;
values.forEach(function(v) {
count += v['count'];
});
return {count: count};
}
db.name.mapReduce(map, reduce, {out: "grouped"})
db.grouped.find()
Untuk mendapatkan hanya mereka yang memiliki hitungan lebih besar dari 1, saya lakukan
db.grouped.aggregate([{$match:{"value.count":{$gt: 1}}}])
Contoh hasilnya adalah sebagai berikut
{
"_id" : {
"institutionId" : "1004",
"workId" : "591426"
},
"value" : {
"count" : 2
}
}
Tapi saya penasaran apakah mungkin melakukannya hanya dengan melakukan MapReduce sebagai satu pernyataan. Seperti menambahkan finalizer atau lebih.