如何通过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
相关产品推荐
相关产品推荐

