首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MongoDB中获取所有值最高的数据

在MongoDB中获取所有值最高的数据
EN

Stack Overflow用户
提问于 2022-01-21 20:06:24
回答 1查看 54关注 0票数 0

我在MongoDB 5中有一个名为“漏洞”的集合。

代码语言: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
复制
[
  { _id: "...", "project": 244, "scanner": "sonarqube", "version": 2 },
  { _id: "...", "project": 244, "scanner": "sonarqube", "version": 2 },
  { _id: "...", "project": 244, "scanner": "shellcheck", "version": 3 },
  { _id: "...", "project": 244, "scanner": "powershell", "version": 4 },
  { _id: "...", "project": 244, "scanner": "powershell", "version": 4 }
]

我只想用一个查询来完成它。

有什么建议吗?

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-21 20:49:01

代码语言:javascript
复制
  db.collection.aggregate([
   {
     $sort: {
           version: -1
           }
  },
  {
   $group: {
  _id: "$scanner",
  version: {
    $first: "$version"
  },
  test: {
    $push: {
      v: "$version",
      id: "$_id",
      p: "$project"
      }
     }
    }
  },
  {
   $project: {
     items: {
      $filter: {
        input: "$test",
        as: "item",
        cond: {
        $eq: [
          "$$item.v",
          "$version"
        ]
       }
      }
     }
   }
  },
   {
    $unwind: "$items"
   },
   {
    $project: {
     scanner: "$_id",
     _id: "$items.id",
     project: "$items.p",
     version: "$items.v"
    }
   }
  ])

解释:

  1. 按版本降序(排序)
  2. 逐个扫描程序从每个版本的列表中获取第一个值,并将测试数组中的所有值推送到测试数组中,因此我们适合在下一阶段进行筛选。
  3. 只从测试数组中筛选我们需要的最大版本的元素。
  4. 解压只过滤最大值的测试数组。
  5. 在最后的$project阶段,将字段重命名为所需的原始名称

游乐场

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70807091

复制
相关文章

相似问题

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