在不丢弃 mongoDB 中的整个文档的情况下查找具有公共字段的组的最大值
Find max of groups with common field without discarding the whole document in mongoDB
我的数据库中有一个集合,我已经设法编写了一个聚合管道 returns 这种结果:
ip, type, count
其中 ip, type
是我分组的字段,count
是在我的集合中找到的这些对的数量。
我现在如何只保留 ip, type
对,其中 count
是所有 ip 的最大值?
例如
ip1, type1, 10
ip1, type2, 20
ip1, type3, 30
ip2, type1, 30
ip2, type2, 10
在这 3 个中,我只想保留 ip1,type3,因为 30 是所有类型 ip1 和 ip2,type1 的最大值,因为 30 是所有类型 ip2 的最大值。
您需要 运行 另一个 $group
才能获得 maxCount
。可以使用 $$ROOT
变量捕获属于单个组的所有文档。然后您可以 运行 $filter to find the one that has highest value and use $replaceRoot 将该文档提升回结果的根级别:
db.collection.aggregate([
{
$group: {
_id: "$_id.ip",
docs: { $push: "$$ROOT" },
maxCount: { $max: "$count" }
}
},
{
$replaceRoot: {
newRoot: {
$arrayElemAt: [ { "$filter": { input: "$docs", cond: { $eq: [ "$$this.count", "$maxCount" ] } } } ,0]
}
}
}
])
我的数据库中有一个集合,我已经设法编写了一个聚合管道 returns 这种结果:
ip, type, count
其中 ip, type
是我分组的字段,count
是在我的集合中找到的这些对的数量。
我现在如何只保留 ip, type
对,其中 count
是所有 ip 的最大值?
例如
ip1, type1, 10
ip1, type2, 20
ip1, type3, 30
ip2, type1, 30
ip2, type2, 10
在这 3 个中,我只想保留 ip1,type3,因为 30 是所有类型 ip1 和 ip2,type1 的最大值,因为 30 是所有类型 ip2 的最大值。
您需要 运行 另一个 $group
才能获得 maxCount
。可以使用 $$ROOT
变量捕获属于单个组的所有文档。然后您可以 运行 $filter to find the one that has highest value and use $replaceRoot 将该文档提升回结果的根级别:
db.collection.aggregate([
{
$group: {
_id: "$_id.ip",
docs: { $push: "$$ROOT" },
maxCount: { $max: "$count" }
}
},
{
$replaceRoot: {
newRoot: {
$arrayElemAt: [ { "$filter": { input: "$docs", cond: { $eq: [ "$$this.count", "$maxCount" ] } } } ,0]
}
}
}
])