MongoDB文档按自定义状态+创建时间排序异常求助
解决MongoDB自定义状态排序+同状态创建时间倒序问题
你的代码存在两个核心问题,导致创建时间顺序被打乱:
$project阶段只保留了_id和status,丢失了创建时间字段,后续无法基于它排序$sort阶段仅按自定义状态字段排序,没添加创建时间的倒序规则,同时还存在语法错误
以下是修正后的完整代码:
let sortedIncidents = await Incident.aggregate([ { $match: query }, // 若不需要过滤字段,直接去掉$project;若要保留特定字段,必须包含创建时间(比如createdAt) // { // $project: { // _id: 1, // status: 1, // createdAt: 1 // 必须保留创建时间字段 // } // }, { $addFields: { sortField: { $cond: [ { $eq: ["$status", "NACK"] }, 1, { $cond: [ { $eq: ["$status", "ACK"] }, 2, 3 ]} ] } }}, // 先按自定义状态顺序升序,再按创建时间倒序 { $sort: { sortField: 1, createdAt: -1 } }, { $skip: pagination.skip }, { $limit: pagination.perPage }, ])
关键改动说明:
- 保留创建时间字段:要么移除
$project让管道保留所有原有字段,要么在$project中明确声明创建时间字段(比如createdAt:1),否则后续排序无法调用该字段。 - 补充排序规则:
$sort阶段同时指定两个排序条件——先按sortField升序保证NACK→ACK→RES的顺序,再按createdAt倒序实现同状态下最新文档优先。 - 修复语法错误:原
$sort阶段的写法不符合JS对象语法,修正为{ $sort: { sortField: 1, createdAt: -1 } }的正确格式。
注:如果你的创建时间字段不是createdAt,请替换为实际字段名,比如createTime。
内容的提问来源于stack exchange,提问作者damanpreet singh
相关产品推荐
相关产品推荐

