MongoDB(PHP7.2)数组追加push操作异常问题求助
你的问题主要出在对MongoDB $push操作的目标理解错误,以及更新路径和数据格式的错误处理上,我来一步步帮你拆解:
核心错误原因
$push操作的目标字段类型不匹配
你收到的错误BulkWriteException: The field 'episodes' must be an array but is of type object很明确:episodes是一个MongoDB对象(document),但$push只能用于数组类型的字段。你本来想往episodes.3x.My First Title这个数组里追加元素,但你的代码错误地把$push指向了episodes这个对象字段,自然会触发类型错误。数据格式处理错误
你把要添加的$final_array_to_update用json_encode()转成了字符串,这会导致MongoDB存入的是一个字符串值,而不是你需要的对象结构,完全不符合需求。更新路径构建错误
你构建的$internal_json结构完全不对,MongoDB需要用**点符号(dot notation)**来指定嵌套字段的路径,而不是嵌套数组的形式。
修正后的PHP代码
下面是修复后的完整代码,我添加了注释说明每个步骤的作用:
try { // 注意:这里不需要json_encode,直接用数组即可,驱动会自动转成BSON对象 $new_episode = $final_array_to_update; // 你的待添加数据:["offsetLeft" => 157, "offsetTop" => -1, "episode_number" => "50"] // 构建正确的$push操作:使用点符号指定目标数组的路径 $update_operation = [ '$push' => [ 'episodes.3x.My First Title' => $new_episode ] ]; // 执行更新:匹配_id,执行$push操作 $result = $collection->updateOne( ["_id" => $_id], $update_operation ); // 可以检查是否真的更新了文档 if ($result->getModifiedCount() > 0) { echo "成功更新文档,修改了{$result->getModifiedCount()}条记录"; } else { echo "没有文档被修改,可能是_id不匹配或者数据已存在"; } } catch (Exception $ex) { echo "更新失败:" . $ex->getMessage(); }
额外说明
为什么之前显示"Updated The Document."但数据库没变化?
因为第一次执行时,你的update操作虽然逻辑错误,但MongoDB匹配到了对应的_id文档,驱动返回了"更新成功"的状态,但实际上你的更新操作没有修改到任何有效字段(你试图往对象字段push,MongoDB会忽略这种无效操作),所以数据库里看不到变化。之后的操作触发了明确的类型错误,才抛出了异常。关于字段名中的空格
My First Title包含空格,MongoDB的点符号支持这种字段名,不需要额外转义,PHP驱动会正确处理。
内容的提问来源于stack exchange,提问作者Xonshiz

