如何查询集合中每天特定时间(如下午3点)创建的所有文档?
查询集合中下午3点创建的文档
要筛选createdAt字段为JavaScript Date类型、且创建时间为下午3点(即小时数为15)的文档,以MongoDB为例,可通过以下方式实现:
方法1:用聚合表达式提取小时判断
通过$expr结合$hour操作符直接提取createdAt的小时数,判断是否等于15:
db.yourCollectionName.find({ $expr: { $eq: [{ $hour: "$createdAt" }, 15] } })
注意时区问题
JavaScript Date对象本质存储的是UTC时间戳,$hour默认提取UTC时区的小时数。如果业务使用本地时区(比如东八区),需要在提取小时时指定时区参数:
db.yourCollectionName.find({ $expr: { $eq: [{ $hour: { date: "$createdAt", timezone: "Asia/Shanghai" } }, 15] } })
替换"Asia/Shanghai"为你实际使用的时区标识符即可。
方法2:预存小时字段优化大数据量查询
如果集合数据量较大,$expr可能无法利用createdAt的索引,导致查询效率偏低。建议创建文档时额外存储createdHour字段,后续查询会更高效:
- 插入文档时:
db.yourCollectionName.insertOne({ // 其他业务字段 createdAt: new Date(), createdHour: new Date().getHours() // 需根据业务时区调整时,替换为对应时区的小时数 })
- 查询时:
db.yourCollectionName.find({ createdHour: 15 })
内容的提问来源于stack exchange,提问作者Baron Young
相关产品推荐
相关产品推荐

