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

MongoDB按dateTime与name排序时如何实现同name数据按时间归组?

实现方案

你需要借助MongoDB聚合管道实现该排序需求,以下是两种可行方案:

方案1:兼容全版本MongoDB

db.yourCollectionName.aggregate([
  // 按name分组,计算每组最早时间,同时保留全部原始文档
  {
    $group: {
      _id: "$name",
      groupMinDateTime: { $min: { $toDate: "$dateTime" } },
      docs: { $push: "$$ROOT" }
    }
  },
  // 按组最早时间升序排列,确定组的先后顺序
  { $sort: { groupMinDateTime: 1 } },
  // 拆分文档数组,恢复为单文档结构
  { $unwind: "$docs" },
  // 组内按自身时间升序排列,同时保留组的顺序不变
  { $sort: { groupMinDateTime: 1, "docs.dateTime": 1 } },
  // 还原为原始文档结构,移除冗余字段
  { $replaceRoot: { newRoot: "$docs" } }
])

方案2:MongoDB 5.0+ 窗口函数实现(更简洁)

db.yourCollectionName.aggregate([
  // 给每个文档新增所属分组的最早时间字段
  {
    $setWindowFields: {
      partitionBy: "$name",
      sortBy: { dateTime: 1 },
      output: {
        groupMinDateTime: {
          $min: "$dateTime",
          window: { documents: ["unbounded", "unbounded"] }
        }
      }
    }
  },
  // 先按组最早时间排序,再按文档自身时间排序
  { $sort: { groupMinDateTime: 1, dateTime: 1 } },
  // 移除冗余的分组时间字段
  { $unset: "groupMinDateTime" }
])

注意事项

  • 如果你存储的dateTime已经是Date类型,直接去掉代码中的$toDate转换即可,修改为groupMinDateTime: { $min: "$dateTime" }
  • 字符串格式的日期必须转成Date类型后排序,避免出现字符串排序的逻辑错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:45:09