如何在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值列表 } } ])
代码解释
- $unwind:把每个文档的
hist数组拆分成独立文档,每个数组元素单独成为一条记录,后续可以针对单个元素筛选。 - $match:精准过滤出
hist.username等于目标值的条目,同时加上$exists判断确保只处理有changed_from字段的记录。 - $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
相关产品推荐
相关产品推荐

