【问题标题】:Group by name, then select one document of each name with highest arbitrary field value按名称分组,然后选择每个名称中任意字段值最高的一个文档
【发布时间】:2021-02-04 17:36:40
【问题描述】:

假设我们有一个包含以下文档的集合:

[
    {'_id': ..., 'name': 'Type A', 'version': 1, ...},
    {'_id': ..., 'name': 'Type B', 'version': 1, ...},
    {'_id': ..., 'name': 'Type B', 'version': 2, ...},
    {'_id': ..., 'name': 'Type B', 'version': 3, ...},
    {'_id': ..., 'name': 'Type C', 'version': 1, ...},
    {'_id': ..., 'name': 'Type C', 'version': 2, ...},
    {'_id': ..., 'name': 'Type A', 'version': 2, ...},
    {'_id': ..., 'name': 'Type B', 'version': 4, ...},
    {'_id': ..., 'name': 'Type A', 'version': 3, ...},
    {'_id': ..., 'name': 'Type B', 'version': 5, ...},
]

我想返回一个列表,其中包含具有各自名称的最高版本的文档,这样返回看起来像这样,本质上是为每个具有最高版本的不同名称返回 $$ROOT:

[
    {'_id': ..., 'name': 'Type A', 'version': 3, ...},
    {'_id': ..., 'name': 'Type C', 'version': 2, ...},
    {'_id': ..., 'name': 'Type B', 'version': 5, ...},
]

我知道我需要使用聚合管道,使用组排序和限制,但我似乎无法得到我想要实现的目标。

【问题讨论】:

    标签: mongodb aggregation-framework pymongo


    【解决方案1】:
    • $sort version 按降序排列
    • $group by name 并从分组中获取第一个根文档
    • (可选) $replaceRootroot 对象替换为根
    pipeline = [
      { $sort: { version: -1 } },
      {
        $group: {
          _id: "$name",
          root: { $first: "$$ROOT" }
        }
      },
      { $replaceRoot: { newRoot: "$root" } }
    ]
    
    result = db.collection.aggregate(pipeline)
    

    Playground

    【讨论】:

      猜你喜欢
      • 2020-03-23
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 2018-04-15
      • 2015-09-30
      • 1970-01-01
      相关资源
      最近更新 更多