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

如何编写MongoDB查询获取文档auditlogs数组的倒数第二条记录

MongoDB查询获取文档auditlogs数组倒数第二条记录方案

算子选择说明

你原本考虑使用的$first和$last是$group阶段专用的聚合函数,作用是提取分组后组内首尾文档的指定字段,并不适用于单文档内部数组元素提取的场景,因此不需要使用$group算子实现当前需求。

实现查询(兼容MongoDB 3.2及以上版本)

使用$arrayElemAt算子直接提取数组指定位置的元素,传入负数索引即可从数组末尾开始计数,-2对应倒数第二条记录:

db.yourCollectionName.aggregate([
  {
    $project: {
      // 保留原文档_id
      _id: 1,
      // 直接提取auditlogs数组倒数第二个元素
      secondLastLog: { $arrayElemAt: ["$auditlogs", -2] }
    }
  },
  {
    // 调整输出结构匹配你的预期格式
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          { docId: "$_id" }, // 这里把原文档_id改名为docId避免和日志内的_id字段冲突,你也可以根据需求调整
          "$secondLastLog"
        ]
      }
    }
  }
])

注:你提供的期望输出里同时存在两个_id字段属于JSON语法错误,实际查询时建议将原文档的_id重命名为其他字段名避免字段冲突。

查询逻辑说明

  • $arrayElemAt接收两个参数,第一个是目标数组字段,第二个是索引位置,传入负数值就会从数组末尾往前计数
  • $mergeObjects用于合并原文档的_id和提取出的审计日志字段,最终输出结构和你预期的结果一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:36:02