MongoDB如何仅按日期过滤含时间的datetime字段?
MongoDB按日期过滤文档(忽略时间部分)
嗨,我来帮你搞定这个需求!要实现类似SQL中date(created_time) = "2018-01-26"的效果——也就是只匹配指定日期、忽略时分秒部分,这里有几种实用的方法,按推荐程度排序:
1. 范围查询(推荐,性能最优)
这是生产环境最常用且性能最好的方式,利用$gte和$lt限定当天的时间范围:从目标日期的0点开始,到第二天的0点结束。这种方法能直接复用created_time字段的索引,查询效率拉满。
示例代码:
db.your_collection.find({ created_time: { $gte: ISODate("2018-01-26T00:00:00.000+05:00"), $lt: ISODate("2018-01-27T00:00:00.000+05:00") } })
注意:要和你的created_time字段时区保持一致,比如例子里的+05:00,如果是UTC时区就用Z代替。
2. 聚合管道匹配(MongoDB 5.0+推荐用$dateTrunc)
如果更倾向于直观的“提取日期”逻辑,可以用聚合管道的日期处理操作符。其中MongoDB 5.0及以上版本提供的$dateTrunc非常简洁,能直接把日期截断到“天”级别:
用$dateTrunc的示例:
db.your_collection.aggregate([ { $match: { $expr: { $eq: [ { $dateTrunc: { date: "$created_time", unit: "day" } }, ISODate("2018-01-26T00:00:00.000+05:00") ] } } } ])
兼容旧版本的$dateToString方法:
如果你的MongoDB版本低于5.0,可以用$dateToString把日期转成字符串后匹配:
db.your_collection.aggregate([ { $match: { $expr: { $eq: [ { $dateToString: { format: "%Y-%m-%d", date: "$created_time" } }, "2018-01-26" ] } } } ])
注意:聚合方法的缺点是无法利用created_time的索引,数据量大时性能会比范围查询差很多,所以只建议在小数据集或测试场景使用。
3. $where查询(不推荐)
虽然可以用$where执行JavaScript逻辑来提取日期字符串,但这种方法会逐文档执行脚本,完全无法使用索引,性能极差,强烈不建议在生产环境使用:
db.your_collection.find({ $where: function() { return this.created_time.toISOString().slice(0, 10) === "2018-01-26"; } })
内容的提问来源于stack exchange,提问作者Saifullah khan
相关产品推荐
相关产品推荐

