У меня есть данные в MongoDB. Структура одного объекта такова:
{
"_id" : ObjectId("5395177980a6b1ccf916312c"),
"institutionId" : "831",
"currentObject" : {
"systemIdentifiers" : [
{
"value" : "24387",
"system" : "ABC"
}]
}
}
Я должен знать, сколько объектов имеют одинаковые institutionId и systemIdentifiers[0].value и хочу вернуть только те, которые дублируются таким образом. Для этого я группирую их по этим идентификаторам и подсчитываю вхождения.
Объект (пара идентификаторов) должен быть возвращен, когда count больше 1.
Это кусок кода, который выполняет группировку с использованием 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()
Чтобы получить только те, у которых счет больше 1, я делаю
db.grouped.aggregate([{$match:{"value.count":{$gt: 1}}}])
Затем приводится пример результата
{
"_id" : {
"institutionId" : "1004",
"workId" : "591426"
},
"value" : {
"count" : 2
}
}
Но мне любопытно, возможно ли это сделать, просто выполнив MapReduce как одно выражение. Например, добавить финализатор или что-то в этом роде.