gpt4 book ai didi

javascript - MongoDB MapReduce,仅当 count > 1 时返回

转载 作者:可可西里 更新时间:2023-11-01 09:34:44 25 4
gpt4 key购买 nike

我在 MongoDB 中有数据。一个对象的结构是这样的:

{
"_id" : ObjectId("5395177980a6b1ccf916312c"),
"institutionId" : "831",
"currentObject" : {
"systemIdentifiers" : [
{
"value" : "24387",
"system" : "ABC"
}]
}
}

我必须知道有多少对象具有相同的 institutionIdsystemIdentifiers[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 之类的东西。

最佳答案

如果有一个文档有一个键,它将永远不会进入reduce,被认为已经被reduce了,这就是MongoDB map-reduce的行为:

MongoDB will not call the reduce function for a key that has only asingle value.

使用 finalzie 也没有多大帮助,即如果在 finalize 函数中你做了一个 if count > 1 then return reducedVal else None,那么结果中将没有(而不是 1) .

恐怕使用(一个)map-reduce,结果中计数为 1 的文档将总是,因为它们是从 map 中触发的。

您可以在一个链中使用 2 个 map reduce 操作,在第二个 map 中您不会发出计数 < 2 的文档。但是这些并不认为它比您的示例中的额外查询更好。

关于javascript - MongoDB MapReduce,仅当 count > 1 时返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40908682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com