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

MongoDB如何获取数组中含最大passwordDate的完整对象?

解决MongoDB聚合获取数组中最大passwordDate的完整对象问题

你原来的查询只提取了passwordDate的最大值,没有保留对应的完整对象,以下是两种可行的实现方式:

方法一:使用$reduce高效遍历数组(推荐,无需拆分数组)

这种方式直接在原数组上遍历比较,性能更优:

db.users.aggregate([
  // 匹配目标用户
  { "$match": { "username_id": "user01" } },
  // 投影出需要的结果
  { "$project": {
    "_id": 0,
    "lastPassword": {
      "$reduce": {
        "input": "$passwordList", // 遍历的数组
        "initialValue": { "passwordDate": { "$numberLong": "0" } }, // 初始值设为最小日期
        "in": {
          // 比较当前元素和上一次结果的passwordDate,保留更大的那个完整对象
          "$cond": [
            { "$gt": [ "$$this.passwordDate", "$$value.passwordDate" ] },
            "$$this",
            "$$value"
          ]
        }
      }
    }
  }}
])

方法二:使用$unwind+$sort+$group(适合多用户批量处理)

如果需要同时处理多个用户的最大密码记录,可以用这种方式:

db.users.aggregate([
  { "$match": { "username_id": "user01" } },
  { "$unwind": "$passwordList" }, // 拆分数组成独立文档
  { "$sort": { "passwordList.passwordDate": -1 } }, // 按passwordDate降序排序
  { "$group": {
    "_id": "$username_id", // 按用户分组
    "lastPassword": { "$first": "$passwordList" } // 取排序后的第一个元素(即最大日期的对象)
  }},
  { "$project": {
    "_id": 0,
    "lastPassword": 1
  }}
])

原查询问题说明

你之前用$map把数组中的每个元素只提取了passwordDate,再用$max取最大值,所以最终只能得到单独的日期值,而无法保留对应的pass字段和完整对象结构。上述两种方法都能直接获取包含最大passwordDate的完整对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:50:16