PHP与MongoDB日期范围查询无结果问题求助
PHP与MongoDB日期范围查询问题解决
嘿,我来帮你搞定这个查不到数据的问题!核心原因其实很简单:你数据库里的time字段是字符串类型(格式是"2019-11-15T18:24:31.552363Z"),但你在PHP代码里用了MongoDate对象来做范围匹配,类型不匹配自然查不到结果。下面给你两种解决方案,按需选择:
方案一:将数据库字段转为日期类型(推荐)
MongoDB的日期类型(ISODate)才是做时间范围查询的最佳选择,不仅查询效率更高,还能避免字符串比较的潜在问题。
1. 先批量转换数据库中的time字段
用MongoDB Shell执行以下命令,把所有字符串类型的rxInfo.time转成日期类型:
db.nodes.updateMany( {"rxInfo.time": {$type: "string"}}, [{$set: {"rxInfo.time": {$toDate: "$rxInfo.time"}}}] )
2. 修改PHP查询代码
注意区分你用的是旧版mongo扩展还是新版mongodb扩展:
- 旧版
mongo扩展(已废弃,但如果还在使用):
// 直接获取时间戳,不需要额外转date字符串 $startTimestamp = strtotime('2019-01-09T00:00:00Z'); $endTimestamp = strtotime('2020-01-09T23:59:59Z'); $startOfDay = new MongoDate($startTimestamp); $endOfDay = new MongoDate($endTimestamp); $where = ["rxInfo.time" => ['$gt' => $startOfDay, '$lt' => $endOfDay]]; $query = $m->nodes->$nodeName->find($where); foreach ($query as $current) { $Ptemperature = $current["object"]["TempC_SHT"]; // 可以加输出验证结果 echo "获取到温度:{$Ptemperature}\n"; }
- 新版
mongodb扩展(推荐使用,旧扩展已停止维护):
// UTCDateTime需要传入毫秒级时间戳,所以乘以1000 $startMs = strtotime('2019-01-09T00:00:00Z') * 1000; $endMs = strtotime('2020-01-09T23:59:59Z') * 1000; $startOfDay = new MongoDB\BSON\UTCDateTime($startMs); $endOfDay = new MongoDB\BSON\UTCDateTime($endMs); $where = ["rxInfo.time" => ['$gt' => $startOfDay, '$lt' => $endOfDay]]; $query = $m->nodes->$nodeName->find($where); foreach ($query as $current) { $Ptemperature = $current["object"]["TempC_SHT"]; echo "获取到温度:{$Ptemperature}\n"; }
方案二:直接使用字符串做范围查询(临时方案)
如果你暂时不想修改数据库,也可以直接用ISO8601字符串做范围查询——因为这种格式的字符串是按字典序排列的,和时间顺序一致,所以字符串比较能生效:
$startStr = '2019-01-09T00:00:00Z'; $endStr = '2020-01-09T23:59:59Z'; $where = ["rxInfo.time" => ['$gt' => $startStr, '$lt' => $endStr]]; $query = $m->nodes->$nodeName->find($where); foreach ($query as $current) { $Ptemperature = $current["object"]["TempC_SHT"]; }
⚠️ 注意:这种方式在数据量较大时查询效率会比日期类型低很多,所以还是优先推荐方案一。
你原来代码的小错误
你之前写的date('Y-m-d',strtotime('2019-01-09T00:00:00'))是多余的——strtotime已经返回了时间戳,直接传给MongoDate就行,转成日期字符串再处理反而可能导致时间解析错误,这也是你查不到数据的一个小诱因哦。
内容的提问来源于stack exchange,提问作者Q Lion
相关产品推荐
相关产品推荐

