如何在PHP中正确实现MongoDB日期范围查询?
解决MongoDB时间段查询无结果的问题
我来帮你排查下问题所在,主要有两个核心错误导致你查不到结果:
1. 查询条件的逻辑对应完全搞反了
你的需求是数据库的startdate ≤ 输入的结束日期,且数据库的enddate ≥ 输入的起始日期,但你写的查询里,把数据库的startdate和输入的起始日期做了$lte,把数据库的enddate和输入的结束日期做了$gte,这完全不符合你的查询逻辑,自然匹配不到数据。
2. UTCDatetime的时间戳单位错误
MongoDB\BSON\UTCDatetime要求传入的是毫秒级的时间戳,而strtotime()函数返回的是秒级时间戳,直接传入的话,相当于把日期转换成了1970年左右的时间,和你数据库里的2018年数据完全不匹配。
修正后的完整代码
首先正确转换输入日期为MongoDB需要的UTCDatetime:
// 把输入的起始日期转成毫秒级时间戳,再实例化UTCDatetime $inputStartDatetime = new MongoDB\BSON\UTCDatetime(strtotime($_POST['startdate'] . " 00:00:00") * 1000); // 把输入的结束日期转成毫秒级时间戳,再实例化UTCDatetime $inputEndDatetime = new MongoDB\BSON\UTCDatetime(strtotime($_POST['enddate'] . " 00:00:00") * 1000);
然后构造符合逻辑的查询条件:
$query = [ 'startdate' => ['$lte' => $inputEndDatetime], // 数据库的startdate ≤ 输入的结束日期 'enddate' => ['$gte' => $inputStartDatetime] // 数据库的enddate ≥ 输入的起始日期 ];
额外验证技巧
如果还是不确定,可以把转换后的UTCDatetime转成可读日期验证一下:
// 打印转换后的日期,确认是否和输入一致 echo $inputStartDatetime->toDateTime()->format('Y-m-d H:i:s');
这样调整后,应该就能正确查询到符合时间段条件的数据了。
内容的提问来源于stack exchange,提问作者Diego de Lima
相关产品推荐
相关产品推荐

