Mongo条件排序实现:优先未提交工时表并按规则排序
解决方案
要实现未提交记录按Time升序在前、已提交记录按Time降序在后的排序需求,可以通过MongoDB聚合框架生成临时排序字段,配合$sort完成目标排序。具体聚合管道如下:
db.collection.aggregate([ // 生成临时排序字段:未提交记录用原Time值,已提交记录用Time的负值 { $addFields: { sortTime: { $cond: { if: { $eq: ["$Submitted", false] }, then: "$Time", else: { $multiply: ["$Time", -1] } } } } }, // 先按Submitted升序(false在前),再按sortTime升序 { $sort: { Submitted: 1, sortTime: 1 } }, // 移除临时字段,保留业务所需字段 { $project: { sortTime: 0 } } ])
逻辑说明
- 临时字段生成:通过
$cond判断记录提交状态,未提交记录直接使用原Time值,已提交记录将Time取反。后续排序时,已提交记录的sortTime升序等价于原Time降序。 - 排序规则:
- 按
Submitted升序:MongoDB中布尔值false被视为0,true视为1,因此未提交记录会默认排在已提交记录之前。 - 按
sortTime升序:未提交记录按原Time从小到大排列,已提交记录因sortTime为负值,升序排列对应原Time从大到小排列。
- 按
- 清理临时字段:通过
$project移除生成的sortTime,只保留Time和Submitted字段。
执行上述聚合后,将得到符合需求的排序结果:
| Time | Submitted |
|---|---|
| 4 | False |
| 5 | False |
| 6 | False |
| 3 | True |
| 2 | True |
| 1 | True |
内容的提问来源于stack exchange,提问作者Joe Jankowiak
相关产品推荐
相关产品推荐

