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
相关产品推荐
相关产品推荐

