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

如何通过PHP+Ajax获取MongoDB查询结果中的ObjectId字符串?

解决MongoDB ObjectId在PHP+AJAX中显示为[object Object]的问题

这个问题很常见,根源在于MongoDB的ObjectId是一个特殊对象,直接用json_encode序列化时,它会被转成包含$oid属性的嵌套对象,前端JS拿到后就会显示成[object Object]。下面给你两种解决方案,推荐优先在后端处理:

方案一:后端PHP处理(推荐)

在PHP中遍历查询结果,把每个文档的_id字段强制转为字符串后再返回。因为MongoDB\BSON\ObjectId类自带了__toString()方法,转成字符串就能得到我们需要的十六进制ID。

修改你的PHP代码如下:

$ref = $_POST['ref'];
try {
    $consulta = ['ref' => $ref, 'excluido' => 'n'];
    $opcoes = [];
    $query = new MongoDB\Driver\Query($consulta, $opcoes);
    $linhas = $conexao->executeQuery($bd . "maquinas", $query);
    
    // 手动处理结果,将ObjectId转为字符串
    $resultados = [];
    foreach ($linhas as $doc) {
        // 将MongoDB文档对象转为普通数组
        $docArray = (array)$doc;
        // 把_id字段转成字符串格式
        $docArray['_id'] = (string)$docArray['_id'];
        $resultados[] = $docArray;
    }
    
    echo json_encode($resultados);
} catch (Exception $exc) {
    echo $exc->getTraceAsString();
}

这样前端拿到的_id直接就是字符串,不需要额外处理,代码更简洁统一。

方案二:前端JS处理

如果暂时不想修改后端代码,也可以在前端AJAX的success回调中,判断_id字段并提取它的$oid属性:

修改你的JS代码:

$.ajax({
    url: 'funcoes/registroeventos.php',
    data: { "ref": ref },
    type: 'post',
    dataType: 'json',
    cache: false,
    beforeSend: function (xhr) { },
    error: function (jqXHR, textStatus, errorThrown) { },
    success: function (dados) {
        $.each(dados, function () {
            $.each(this, function (index, value) {
                // 判断是否是ObjectId对象,提取$oid属性
                const displayValue = index === '_id' && value.$oid ? value.$oid : value;
                alert(displayValue);
            });
        });
    }
});

不过这种方式需要前端额外做判断,而且如果后续有其他地方用到这些数据,都要重复处理,所以还是推荐后端统一处理更靠谱。

内容的提问来源于stack exchange,提问作者Diego de Lima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:46:06