You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:32:46