MongoDB:如何过滤数组字段并获取数组最后一条数据?
如何在MongoDB中过滤数组后进行切片操作
你这段代码的错误确实出在$project阶段的queue字段上——同一个字段不能同时指定两个顶级聚合操作符($filter和$slice),MongoDB无法解析这种冲突的赋值逻辑。以下是两种可行的解决方法:
方法1:同一表达式嵌套过滤与切片
直接把$filter的结果作为$slice的输入,让两个操作按顺序执行:
[ { $match: { _id: ObjectId("65a739bc29c608fd90b65038") } }, { $project: { date: 1, serviceScheduleId: 1, serviceId: 1, branchOfficeId: 1, queue: { $slice: [ { $filter: { input: "$queue", cond: { $eq: ["$$this.user.status", "waiting"] } } }, 1 // 取过滤后数组的前1个元素 ] } } } ]
方法2:分阶段处理(更易读)
先用$addFields(或MongoDB 4.2+的$set)生成过滤后的临时数组,再在后续阶段对这个临时数组进行切片:
[ { $match: { _id: ObjectId("65a739bc29c608fd90b65038") } }, { $addFields: { // 生成过滤后的临时数组 filteredQueue: { $filter: { input: "$queue", cond: { $eq: ["$$this.user.status", "waiting"] } } } } }, { $project: { date: 1, serviceScheduleId: 1, serviceId: 1, branchOfficeId: 1, // 对临时数组切片 queue: { $slice: ["$filteredQueue", 1] }, // 可选:移除临时字段 filteredQueue: 0 } } ]
两种方法都能实现“先过滤数组中user.status为waiting的元素,再取过滤后数组的前1个元素”的需求,可根据代码可读性选择合适的方式。
内容的提问来源于stack exchange,提问作者baniadam
相关产品推荐
相关产品推荐

