我正面临着MongoDB的一个问题。我需要计数所有按字段分组的文档,这些字段具有另一个字段的最高值。
我举个例子:
{ id: 1, scanner: 'bandit', severity: 'low', version: 1 },
{ id: 2, scanner: 'bandit', severity: 'low', version: 1 },
{ id: 3, scanner: 'bandit', severity: 'medium', version: 1 },
{ id: 4, scanner: 'bandit', severity: 'medium', version: 2 },
{ id: 5, scanner: 'bandit', severity: 'high', version: 2 },
{ id: 6, scanner: 'semgrep', severity: 'critical', version: 2 },
{ id: 7, scanner: 'semgrep', severity: 'critical', version: 3 },
{ id: 8, scanner: 'semgrep', severity: 'info', version: 4 },
{ id: 9, scanner: 'semgrep', severity: 'info', version: 4 },在本例中,我们有两个扫描器(bandit和semgrep)。
“强盗”文档的最高版本是2,而"semgrep“文档的最高版本是4。
我需要根据扫描仪和严重性对它们进行分组,这取决于它们的最高版本,忽略了以前的版本,并对它们进行计数。
其结果应与此类似:
[
{ "scanner": "bandit", "severity": "medium", "count": 1, "version": 2 },
{ "scanner": "bandit", "severity": "high", "count": 1, "version": 2 },
{ "scanner": "semgrep", "severity": "info", "count": 2, "version": 4 }
]我在挣扎,我已经到了不能忽视以前版本的地步。任何帮助都是非常感谢的。
非常感谢
发布于 2022-06-17 00:31:59
与MongoDB v5.0+,
您可以使用$setWindowFields计算scanners分组的排名。然后,使用最高的级别(即秩= 1),您可以执行另一个$group并计数。
db.collection.aggregate([
{
"$setWindowFields": {
"partitionBy": "$scanner",
"sortBy": {
"version": -1
},
"output": {
"rank": {
"$rank": {}
}
}
}
},
{
$match: {
"rank": 1
}
},
{
$group: {
_id: {
"scanner": "$scanner",
"severity": "$severity",
"version": "$version"
},
count: {
$sum: 1
}
}
},
{
$project: {
"_id": 0,
"scanner": "$_id.scanner",
"severity": "$_id.severity",
"version": "$_id.version",
"count": 1
}
}
])这是供您参考的蒙戈游乐场。
https://stackoverflow.com/questions/72652984
复制相似问题