MongoDBで多くのドキュメントを更新する必要があり、サーバーを使用した1回の操作でこれを実行したいと思います。
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に、fieldAdded with Aleph、2をBetaに変更し、Bet、3をGammaに追加し、Ghimelを追加して、次の結果セットを取得します。
{idField: 1, field: "Alpha", fieldAdded: "Aleph"}
{idField: 2, field: "Beta", fieldAdded: "Bet"}
{idField: 3, field: "Gamma", fieldAdded: "Ghimel"}
データベースへの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();
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加