MongoDB:一次操作即可更新多个文档

时间:2019-02-05 17:36:36

标签: php mongodb

我必须在MongoDB上更新许多文档,并且我希望通过服务器执行一次操作。

在诸如MYSQL之类的关系数据库上,我会做这样的事情:

$mysql = new MySQLi($host, $user, $pwd, $db, $port);
$q = "INSERT INTO table (idField, field) VALUES ";

foreach($elements as $el) {
  $q .= "({$el->id}, {$el->field}),";
}

$q = substr($q, 0, -1) . " ON DUPLICATE KEY UPDATE field = VALUES(field)";
$mysql->query($q);

在MongoDB中是否也可以做同样的事情?此刻我有这样的东西:

$mongo = new MongoDB\Client("mongodb://{$host}:{$port}");
$col = $mongo->selectDatabase($db)->selectCollection($collectionName);

foreach($elements as $el) {
  $col->updateOne(array("id" => $el->id), array("field" => $el->field));
}

但这会导致与数据库的大量连接,导致数十亿行的处理非常缓慢。

编辑:

以下是起始数据集的示例:

{idField: 1, field: "A"}
{idField: 2, field: "B"}
{idField: 3, field: "C"}

然后,我想将idField为1的字段修改为Alpha,将添加了Aleph,2的Beta字段添加为Beta,将Bet,3添加为Gamma并添加Ghimel,以获得以下结果集:

{idField: 1, field: "Alpha", fieldAdded: "Aleph"}
{idField: 2, field: "Beta", fieldAdded: "Bet"}
{idField: 3, field: "Gamma", fieldAdded: "Ghimel"}

是否可以仅向数据库发送一个请求?

1 个答案:

答案 0 :(得分:1)

使用bulkWrite方法如下进行批量更新

$ops = array();      

foreach ($elements as $el) {  
    $update = [
        'updateOne' => [
            [ 'id' => $el->id ], 
            [ '$set' => [ 'field' => $el->field ] ]
        ]
    ];          
    array_push($ops, $update);                        
}

$result = $col->bulkWrite($ops);
echo $result->getModifiedCount();
相关问题