如何基于created_at epoch字段查询MongoDB整点插入的数据?
查询MongoDB中整点时间的数据方法
嘿,这个需求很好实现,咱们可以借助MongoDB的表达式和日期处理功能,精准定位到每个整点的记录。结合你文档里的created_at(epoch秒数)字段,给你分享几个实用的方法:
方法一:直接通过数值运算匹配整点
因为整点时间的epoch秒数刚好是3600(1小时的秒数)的整数倍,所以咱们可以用取模运算来筛选:
db.yourCollection.find({ $expr: { $eq: [{ $mod: ["$created_at", 3600] }, 0] } })
说明
$expr让咱们能在查询条件里使用聚合表达式$mod计算created_at除以3600的余数,余数为0就说明这个时间恰好是整点
方法二:转换为日期类型后匹配(更直观)
如果习惯用日期字段来判断,可以先把epoch秒数转成MongoDB的日期对象,再检查分钟和秒数是否都为0:
db.yourCollection.find({ $expr: { $and: [ { $eq: [{ $minute: { $toDate: { $multiply: ["$created_at", 1000] } } }, 0] }, { $eq: [{ $second: { $toDate: { $multiply: ["$created_at", 1000] } } }, 0] } ] } })
说明
$multiply: ["$created_at", 1000]:把秒级的epoch时间转成毫秒级,因为MongoDB的$toDate需要毫秒参数$minute和$second分别提取日期对象的分钟和秒数,两者都为0的就是整点记录
进阶:按整点分组整理数据
如果需要把每个整点的记录归类到一起,可以用聚合管道来实现:
db.yourCollection.aggregate([ // 先筛选出所有整点数据 { $match: { $expr: { $eq: [{ $mod: ["$created_at", 3600] }, 0] } } }, // 按"年-月-日 小时:00:00"的格式分组 { $group: { _id: { $dateToString: { format: "%Y-%m-%d %H:00:00", date: { $toDate: { $multiply: ["$created_at", 1000] } } } }, // 把该整点的所有记录存入数组 records: { $push: "$$ROOT" } } }, // 按时间升序排列,方便查看 { $sort: { "_id": 1 } } ])
性能优化建议
如果你的集合数据量较大,建议给created_at字段创建索引,能大幅提升查询速度:
db.yourCollection.createIndex({ created_at: 1 })
内容的提问来源于stack exchange,提问作者user3010617
相关产品推荐
相关产品推荐

