MongoDB中ISODate格式日期范围查询及空结果问题排查
MongoDB ISODate 日期范围查询指南及问题排查
嘿,咱们来聊聊MongoDB里ISODate格式的日期范围查询方法,顺便帮你排查下为什么你的查询返回空结果~
一、ISODate 日期范围查询的正确姿势
MongoDB里的ISODate本质就是标准的Date对象,查询的时候直接用new Date()构造日期,或者传入符合ISO格式的字符串就行(MongoDB会自动把字符串解析成Date对象)。常用的比较操作符有这几个:
$gte:大于等于$gt:大于$lte:小于等于$lt:小于
举个基础的日期范围查询例子:
// 查询 created_at 在 2018年1月1日到1月31日之间的文档 db.users.find({ "created_at": { $gte: new Date("2018-01-01T00:00:00Z"), $lt: new Date("2018-02-01T00:00:00Z") } })
小提示:用
$lt下一个周期的起始时间代替$lte当前周期的结束时间,能避开时区或者日期精度带来的坑哦。
另外,要是查询的是同一个字段的多个条件,其实没必要用$and(MongoDB会自动处理同一字段的多个操作符),当然用了也不会报错,就是有点多此一举啦。
二、你的查询返回空结果的原因分析
先看看你的数据和查询语句:
- 你的数据里日期字段是
created_at:{ "created_at" : ISODate("2018-02-01T05:42:03Z") } - 但你的查询语句里写的是
date:db.users.find({$and: [{"date": {$gte: new Date("2018-01-06T05:42:03Z")}},{"date": {$lt: new Date("2018-01-20T05:42:03Z")}}]})
这里有两个致命问题:
- 字段名不匹配:你要查的字段明明是
created_at,结果写了date,MongoDB找不到对应字段,肯定返回空呀! - 日期范围不包含目标数据:就算你把字段名改对了,你的查询范围是2018年1月6日到1月20日,而数据里的日期是2018年2月1日,这个日期根本不在你指定的范围内,自然也查不到东西。
三、修正后的查询语句
如果你想查询那条2018-02-01的数据,比如查2018年2月1日当天的所有文档,可以这么写:
db.users.find({ "created_at": { $gte: new Date("2018-02-01T00:00:00Z"), $lt: new Date("2018-02-02T00:00:00Z") } })
要是你就是想查原来的1月6日到1月20日的范围,那得先确保你的users集合里确实有这个时间段内的created_at数据,并且字段名写对哦。
内容的提问来源于stack exchange,提问作者codex
相关产品推荐
相关产品推荐

