You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MongoDB中聚合查询列表内字典指定键的最大值

MongoDB聚合获取列表字段内指定用户的changed_from最大值(保留原文档name作为_id)

问题说明

需要从集合中文档的hist数组字段里,筛选出指定username对应的changed_from值,计算其最大值,同时以原文档的name作为分组标识(_id),保留对应文档的相关信息。以示例数据中username=duhby为例,需得到每个name下该用户的最大changed_from值(如member5对应150,member1对应126)。

原代码问题分析

原聚合代码直接对$hist.duhby分组、取$hist.changed_from的最大值,错误在于:

  • hist是数组,无法直接通过$hist.duhby定位数组内的字段
  • 没有筛选指定username的条目,导致计算了所有changed_from的最大值,不符合预期

正确聚合实现步骤

完整聚合代码(以username=duhby为例)

db.collection.aggregate([
  // 将hist数组拆分为单个文档,方便逐个筛选处理
  { "$unwind": "$hist" },
  // 筛选出目标username的条目,同时排除无changed_from的记录
  { 
    "$match": {
      "hist.username": "duhby",
      "hist.changed_from": { "$exists": true }
    }
  },
  // 按原文档name分组,计算最大值并可保留对应值列表
  {
    "$group": {
      "_id": "$name",
      "max_changed_from": { "$max": "$hist.changed_from" },
      changed_from_list: { "$push": "$hist.changed_from" } // 可选,返回该用户的所有changed_from值列表
    }
  }
])

代码解释

  1. $unwind:把每个文档的hist数组拆分成独立文档,每个数组元素单独成为一条记录,后续可以针对单个元素筛选。
  2. $match:精准过滤出hist.username等于目标值的条目,同时加上$exists判断确保只处理有changed_from字段的记录。
  3. $group:以原文档的name作为_id分组,用$max计算该分组内目标用户的最大changed_from值;如果需要查看所有符合条件的changed_from值,可通过$push生成值列表。

示例返回结果

针对提供的示例数据,执行后会返回:

[
  { "_id": "member1", "max_changed_from": 126, "changed_from_list": [126] },
  { "_id": "member5", "max_changed_from": 150, "changed_from_list": [150, 125] }
]

动态传入username的写法

如果需要动态指定目标用户名,可使用变量替换(以MongoDB Shell为例):

const targetUser = "duhby";
db.collection.aggregate([
  { "$unwind": "$hist" },
  { 
    "$match": {
      "hist.username": targetUser,
      "hist.changed_from": { "$exists": true }
    }
  },
  {
    "$group": {
      "_id": "$name",
      "max_changed_from": { "$max": "$hist.changed_from" }
    }
  }
])

内容的提问来源于stack exchange,提问作者duhby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:30:46