繁体   English   中英

PHP-将$ filter和$ update数组作为变量传递给MongoDB \\ Collection :: updateMany方法

[英]PHP - Pass in $filter and $update arrays as variables in the `MongoDB\Collection::updateMany` method

我试图使用PHP MongoDB updateMany方法$filter$update数组作为变量传递。

官方文档为updateMany提供了以下模板:

function updateMany($filter, $update, array $options = []): MongoDB\UpdateResult

$filterarray|object$updatearray|object

当我对$filter$update数组进行硬编码时,我能够成功使用updateMany

选项1:对阵列进行硬编码(SUCCESS)

$mongo = new Mongo("mongodb://127.0.0.1:27017/myDB");
$db = new MongoDB\Database($mongo, "myDB");
$collection = $db->selectCollection("articles");
$result = $collection->updateMany(
    ["_id" => new \MongoDB\BSON\ObjectID("5cae4176af659c1ba03591b5")],
    ['$set' => ["title" => "update_test"]]
);

但是,当我创建数组变量并尝试将其传递时,它不起作用:

选项2:传入数组变量(错误)

$filter_string = "[\"_id\" => new \\MongoDB\\BSON\\ObjectID(\"5cae4171af659c1ba03591b3\")]";
$update_string = "['\$set' => [\"title\" => \"update_test\"]]";

$filter = explode(',', $filter_string);
$update = explode(',', $update_string);

$mongo = new Mongo("mongodb://127.0.0.1:27017/myDB");
$db = new MongoDB\Database($mongo, "myDB");
$collection = $db->selectCollection("articles");
$result = $collection->updateMany(
    [$filter], // Does not work as $filter(without the brackets) either.
    [$update] // Does not work as $update (without the brackets) either.
);

选项2错误消息

Fatal error: Uncaught MongoDB\Exception\InvalidArgumentException: First key in $update argument is not an update operator in /var/www/html/mySite/vendor/mongodb/mongodb/src/Operation/UpdateMany.php:82 Stack trace: #0 /var/www/html/mySite/vendor/mongodb/mongodb/src/Collection.php(1005): MongoDB\Operation\UpdateMany->__construct('myDB', 'articles', Array, Array, Array) #1 /var/www/html/mySite/update.php(105): MongoDB\Collection->updateMany(Array, Array) #2 {main} thrown in /var/www/html/mySite/vendor/mongodb/mongodb/src/Operation/UpdateMany.php on line 82

那没用。 因此,我以为如果我将整个数组作为字符串而不是字符串来传递,那么PHP可能会自动将字符串中的[]解释为数组定界符(当然不起作用):

选项3:将数组变量作为字符串传递(错误)

$filter_string = "[\"_id\" => new \\MongoDB\\BSON\\ObjectID(\"5cae4171af659c1ba03591b3\")]";
$update_string = "['\$set' => [\"title\" => \"update_test\"]]";

$mongo = new Mongo("mongodb://127.0.0.1:27017/myDB");
$db = new MongoDB\Database($mongo, "myDB");
$collection = $db->selectCollection("articles");
$result = $collection->updateMany(
    $filter_string,
    $update_string
);

选项3错误消息

Fatal error: Uncaught MongoDB\Exception\InvalidArgumentException: Expected $update to have type "array or object" but found "string" in /var/www/html/mySite/vendor/mongodb/mongodb/src/Exception/InvalidArgumentException.php:32 Stack trace: #0 /var/www/html/mySite/vendor/mongodb/mongodb/src/Operation/UpdateMany.php(78): MongoDB\Exception\InvalidArgumentException::invalidType('$update', '['$set' => ["ti...', 'array or object') #1 /var/www/html/mySite/vendor/mongodb/mongodb/src/Collection.php(1005): MongoDB\Operation\UpdateMany->__construct('myDB', 'articles', '["_id" => new \\...', '['$set' => ["ti...', Array) #2 /var/www/html/mySite/update.php(105): MongoDB\Collection->updateMany('["_id" => new \\...', '['$set' => ["ti...') #3 {main} thrown in /var/www/html/mySite/vendor/mongodb/mongodb/src/Exception/InvalidArgumentException.php on line 32

Tl; dr:我以什么格式在PHP updateMany方法中传递$filter$update变量?

您可以像这样直接实现,

$filterOption = ["_id" => new \MongoDB\BSON\ObjectID("5cae4176af659c1ba03591b5")],
$updateOption = ["title" => "update_test"];

并在您的更新查询中

$result = $collection->updateMany(
    $filterOption, 
    ['$set' => $updateOption], 
);

这应该工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM