首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按组中的检索值进行MongoDB筛选

按组中的检索值进行MongoDB筛选
EN

Stack Overflow用户
提问于 2022-02-03 23:35:52
回答 2查看 47关注 0票数 0

我在MongoDB里有这个收藏:

代码语言:javascript
复制
[
  { _id: "...", "project": 244, "scanner": "sonarqube", "version": 1 },
  { _id: "...", "project": 244, "scanner": "sonarqube", "version": 2 },
  { _id: "...", "project": 244, "scanner": "sonarqube", "version": 2 },
  { _id: "...", "project": 244, "scanner": "shellcheck", "version": 1 },
  { _id: "...", "project": 244, "scanner": "shellcheck", "version": 2 },
  { _id: "...", "project": 244, "scanner": "shellcheck", "version": 3 },
  { _id: "...", "project": 244, "scanner": "powershell", "version": 2 },
  { _id: "...", "project": 244, "scanner": "powershell", "version": 3 },
  { _id: "...", "project": 244, "scanner": "powershell", "version": 4 },
  { _id: "...", "project": 244, "scanner": "powershell", "version": 4 }
]

我想返回按扫描器分组的项目数,并提供最新(最高)版本:

代码语言:javascript
复制
{ scanner: "sonarqube", count: 2 }, // All items with sonarqube and version: 2
{ scanner: "shellcheck", count: 1 }, // All items with shellcheck and version: 3
{ scanner: "powershell", count: 2 } // All items with powershell and version: 4

到目前为止,我说的是:

代码语言:javascript
复制
db.getCollection("vulnerabilities").aggregate([
{
    $match: { project_id: 422 }
},
{
    $sort: { version: -1 }
},
{
    $group: {
        _id: "$scanner",
        'count': { $first: "$version"},
    }
}
])

这将返回每个组的最新(最高)版本:

代码语言:javascript
复制
sonarqube  | 2 |
shellcheck | 3 |
powershell | 4 |

现在,我要告诉蒙戈:

  • 通过扫描仪筛选带有该版本的
  • 组的项目
  • 添加计数

有什么建议吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-03 23:47:59

最简单的方法可能是先获得计数,然后再按版本排序:

代码语言:javascript
复制
db.getCollection("vulnerabilities").aggregate([
{
    $match: { project_id: 422 }
},
{   
    $group:{
       _id: { scanner: "$scanner", version: "$version"},
       count: { $sum: 1 }
    }
},
{
    $sort: { "_id.version": -1 }
},
{
    $group: {
        _id: "$_id.scanner",
        count: { $first: "$count" },
        version: { $first: "$_id.version" }
    }
}
])
票数 1
EN

Stack Overflow用户

发布于 2022-02-04 03:23:41

您可以在$max阶段使用$group

代码语言:javascript
复制
db.test.aggregate([ 
    {$group : {_id : "$scanner", count : {$sum : 1}, version : {$max : "$version"}}}
])

或者您可以按版本进行$sort并使用$first

代码语言:javascript
复制
db.test.aggregate([
    {$sort : {version: -1}}, 
    {$group : {_id : "$scanner", count : {$sum : 1}, version : {$first : "$version"}}}
])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70979781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档