如何编写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
相关产品推荐
相关产品推荐

