PHP中如何使用MongoDB同文档另一字段的值更新指定字段
问题原因
该问题由两个错误共同导致:
- 只有使用聚合管道作为更新参数时,MongoDB才会将值中的
$字段名解析为同文档的字段引用。你在Mongo Shell中第二个参数用[]包裹就是聚合管道的写法,但PHP代码中没有加这层外层数组,MongoDB会将操作识别为普通更新,直接把$product_name作为字符串写入。 - PHP的双引号字符串会自动解析
$开头的内容为本地PHP变量,你最初写的"$product_name"会被PHP尝试读取当前作用域的$product_name变量,因此抛出未定义变量的Notice。
正确解决方案
将更新参数改为聚合管道写法,同时用单引号包裹$product_name避免PHP解析为本地变量即可,代码如下:
$where = array(); // $set外层套一层数组,表示这是聚合管道更新 $update = array( array( '$set' => array("product_name_copy" => '$product_name') ) ); $options = array("multi" => true); $bulkWrite = new MongoDB\Driver\BulkWrite; $bulkWrite->update($where,$update,$options); $updated = $mongo->executeBulkWrite("$db_name.products", $bulkWrite);
注意:该聚合更新语法要求MongoDB服务端版本 >= 4.2,如果你使用的是更低版本的MongoDB,需要先查询出所有文档,再逐条遍历更新字段。
内容的提问来源于stack exchange,提问作者Nagaraj Juro
相关产品推荐
相关产品推荐

