【问题标题】:Getting all data with highest value in MongoDB在 MongoDB 中获取所有具有最高价值的数据
【发布时间】:2022-01-21 20:06:24
【问题描述】:

我在 MongoDB 5 中有一个名为“漏洞”的集合。它看起来像这样:

[
  { _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 }
]

我想为每个扫描仪检索具有最高版本的文档。它应该返回:

[
  { _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 }
]

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

有什么建议吗?

非常感谢

【问题讨论】:

    标签: database mongodb collections max aggregation


    【解决方案1】:
      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 阶段,根据您需要的原始名称重命名字段

    playground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多