Mongoose聚合查询中匹配对象数组倒数第二项_id的问题求助
解决方案
原写法问题说明
- 缺少数组长度校验:如果数组长度小于2,
$arrayElemAt会返回null,导致匹配逻辑异常 - 比较符可能不符合需求:你当前使用了
$gt(大于)比较符,如果需求是匹配倒数第二项_id等于指定值,需要替换为$eq(等于)
可行聚合写法示例
[ { "$match": { $expr: { $and: [ // 校验数组长度至少为2,避免取到无效值 { $gte: [{ $size: "$path" }, 2] }, // 匹配数组倒数第二项的_id,按需调整比较符($eq/$gt等) { $eq: [ { "$arrayElemAt": ["$path._id", -2] }, mongoose.Types.ObjectId(req.params.id) ] } ] } } }, { "$project": { "_id": 1, "name": 1, "isFile": { // 原逻辑可简化,直接判断$data是否不为null即可 $ne: ["$data", null] } } } ]
注意事项
- 如果你确实需要匹配_id大于指定值的场景,保留原有的
$gt比较符即可 - 把代码中的
path替换为你Schema中实际的数组字段名 - 确保
req.params.id是合法的ObjectId字符串,否则类型转换会报错
内容的提问来源于stack exchange,提问作者user15455820
相关产品推荐
相关产品推荐

