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

如何使用MongoDB的find方法查询createAt字段小时为8点的文档

解决MongoDB查询每日8:00整文档的问题

嘿,我来帮你搞定这个查询需求!你在MySQL里用hour(createAt) = 8的思路完全没问题,MongoDB里也有对应的实现方式,不过写法略有不同,我给你分几种场景详细说明:

1. 匹配所有小时为8的文档(包含8点整到8:59:59的所有时间)

如果你只需要筛选出createAt字段小时部分是8的文档(不管分钟和秒),可以用$expr结合$hour聚合操作符来实现,这和MySQL的hour()函数逻辑一致:

db.yourCollection.find({
  $expr: {
    $eq: [ { $hour: "$createAt" }, 8 ]
  }
})

这里的$hour会提取createAt字段的小时数(返回0-23的整数),$expr的作用是让我们能在查询条件中使用聚合操作符,这是MongoDB普通查询和聚合表达式之间的桥梁。

2. 精确匹配8:00:00整的文档

如果你的需求是严格筛选刚好上午8点整(分钟和秒都为0)的文档,那就要同时校验小时、分钟和秒三个部分:

db.yourCollection.find({
  $expr: {
    $and: [
      { $eq: [ { $hour: "$createAt" }, 8 ] },
      { $eq: [ { $minute: "$createAt" }, 0 ] },
      { $eq: [ { $second: "$createAt" }, 0 ] }
    ]
  }
})

这样就能确保只有时间精确到8:00:00的文档会被返回,避免把8:30、8:59这类文档也包含进来。

3. 结合聚合管道的写法(适合后续需要其他操作的场景)

如果之后你还要对查询结果做分组、统计等聚合操作,可以把上面的条件放到$match阶段里:

db.yourCollection.aggregate([
  {
    $match: {
      $expr: {
        $and: [
          { $eq: [ { $hour: "$createAt" }, 8 ] },
          { $eq: [ { $minute: "$createAt" }, 0 ] },
          { $eq: [ { $second: "$createAt" }, 0 ] }
        ]
      }
    }
  },
  // 这里可以添加其他聚合阶段,比如$group、$project等
])

额外提醒:字段类型问题

如果你的createAt字段不是MongoDB原生的Date类型(比如是字符串格式的时间),记得先把它转换成Date类型再提取小时,用$toDate操作符即可:

db.yourCollection.find({
  $expr: {
    $eq: [ { $hour: { $toDate: "$createAt" } }, 8 ]
  }
})

内容的提问来源于stack exchange,提问作者nio-dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:02:46