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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:13:43