You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
    }
  }
])

逻辑说明

  1. 临时字段生成:通过$cond判断记录提交状态,未提交记录直接使用原Time值,已提交记录将Time取反。后续排序时,已提交记录的sortTime升序等价于原Time降序。
  2. 排序规则:
    • 按Submitted升序:MongoDB中布尔值false被视为0,true视为1,因此未提交记录会默认排在已提交记录之前。
    • 按sortTime升序:未提交记录按原Time从小到大排列,已提交记录因sortTime为负值,升序排列对应原Time从大到小排列。
  3. 清理临时字段:通过$project移除生成的sortTime,只保留Time和Submitted字段。

执行上述聚合后,将得到符合需求的排序结果:

TimeSubmitted
4False
5False
6False
3True
2True
1True

内容的提问来源于stack exchange,提问作者Joe Jankowiak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 22:57:28