PHP通过CURL查询MongoDB日期区间数据返回空对象问题
问题产生原因
查询返回空结果是三个问题共同导致的:
- 字段名拼写错误:接口返回的原始数据中,时间存储字段为
createdAt,查询条件中错写为createdOn,目标字段不存在自然无法匹配数据。 - 日期类型不匹配:MongoDB存储的时间为BSON Date类型,直接传入ISO格式字符串查询时,会按字符串规则做类型校验,无法和库中的日期类型匹配。你使用的是MongoDB Atlas Data API,传递日期参数需要用MongoDB标准扩展JSON格式声明类型。
- 查询区间逻辑错误:你为
$gte(大于等于)和$lt(小于)设置了完全相同的时间值,等价于筛选「时间大于等于T且小于T」的记录,该区间不存在任何合法值,即便字段名、类型都正确,也无法返回匹配结果。
修复方法
按以下步骤调整代码即可:
- 将查询条件中的字段名从
createdOn修正为实际存在的createdAt - 调整时间区间逻辑:如果需要匹配精确时间点,直接使用
$eq条件即可;如果查询时间范围,保证$lt的取值晚于$gte的取值 - 使用MongoDB扩展JSON的
$date字段传递日期类型值,不要直接传入裸字符串 - 不要手动拼接JSON字符串,容易出现引号转义错误,通过PHP数组构造请求参数后,用
json_encode生成请求体稳定性更高 - 移除无用请求头:
Access-Control-Request-Headers: *是浏览器发送CORS预检请求时的专用头,服务端发起CURL请求不需要携带该头。
调整后的可运行代码示例:
// 构造请求参数数组 $requestParams = [ "dataSource" => $this->dataSource, "database" => $this->database, "collection" => $this->collection, "filter" => [ "type" => ['$eq' => $query], "createdAt" => [ // 用$date声明为日期类型,示例为查询2022-04-11全天的数据 '$gte' => ['$date' => '2022-04-11T00:00:00Z'], '$lt' => ['$date' => '2022-04-12T00:00:00Z'] ] ] ]; curl_setopt_array($curl, array( CURLOPT_URL => $this->apiPath . $action, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => json_encode($requestParams), CURLOPT_HTTPHEADER => array( 'Content-Type: application/json', 'api-key: ' . $this->apiKey, ), )); $mongodata = json_decode(curl_exec($curl));
内容的提问来源于stack exchange,提问作者abu abu
相关产品推荐
相关产品推荐

