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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:51:23