我有一些MongoDB中的数据,其中一个对象的结构如下:
{
"_id" : ObjectId("5395177980a6b1ccf916312c"),
"institutionId" : "831",
"currentObject" : {
"systemIdentifiers" : [
{
"value" : "24387",
"system" : "ABC"
}]
}
}
我需要知道有多少个对象拥有相同的institutionId和systemIdentifiers [0] .value ,并只返回以这种方式重复的那些对象。
为了做到这一点,我将它们按这些ID分组并计算发生的次数。
当count大于1时,应返回该对象(即ID对)。
以下是使用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语句就完成。例如添加一个finalizer之类的东西。