【发布时间】:2017-04-15 23:24:46
【问题描述】:
我在 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 左右。
【问题讨论】:
标签: javascript mongodb mapreduce mongodb-query aggregation-framework