web-dev-qa-db-ja.com

mongodb phpライブラリでinsertManyを使用するときに重複ドキュメントを無視する方法は?

mongo php library を使用し、古いデータをmongodbに挿入しようとしています。 insertMany()メソッドを使用し、ドキュメントの巨大な配列を渡します。これには、一意のインデックスに重複したドキュメントが含まれている可能性があります。

ユーザーコレクションがあり、これらのインデックスがあるとします。

[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.users"
    },
    {
        "v" : 1,
        "unique" : true,
        "key" : {
            "email" : 1
        },
        "name" : "shop_id_1_title_1",
        "ns" : "test.users"
    }
]

重複するドキュメントがある場合は、MongoDB\Driver\Exception\BulkWriteExceptionはプロセスを起動および停止します。重複したドキュメントの挿入を無視し(また、例外の発生を防ぐ)、他のドキュメントの挿入を続行する方法を見つけたいです。

php.net ドキュメンテーションでcontinueOnErrorという名前のフラグが見つかりましたが、これはトリックを実行しますが、このライブラリでは機能していないようです。

Php.netの例:

<?php

$con = new Mongo;
$db = $con->demo;

$doc1 = array(
        '_id' => new MongoId('4cb4ab6d7addf98506010001'),
        'id' => 1,
        'desc' => "ONE",
);
$doc2 = array(
        '_id' => new MongoId('4cb4ab6d7addf98506010002'),
        'id' => 2,
        'desc' => "TWO",
);
$doc3 = array(
        '_id' => new MongoId('4cb4ab6d7addf98506010002'), // same _id as above
        'id' => 3,
        'desc' => "THREE",
);
$doc4 = array(
        '_id' => new MongoId('4cb4ab6d7addf98506010004'),
        'id' => 4,
        'desc' => "FOUR",
);

$c = $db->selectCollection('c');
$c->batchInsert(
    array($doc1, $doc2, $doc3, $doc4),
    array('continueOnError' => true)
);

そして、私が mongo php library でフラグを使用しようとした方法:

<?php

$users = (new MongoDB\Client)->test->users

$collection->insertMany([
    [
        'username' => 'admin',
        'email' => '[email protected]',
        'name' => 'Admin User',
    ],
    [
        'username' => 'test',
        'email' => '[email protected]',
        'name' => 'Test User',
    ],
    [
        'username' => 'test 2',
        'email' => '[email protected]',
        'name' => 'Test User 2',
    ],
],
[
    'continueOnError' => true    // This option is not working
]);

上記のコードは依然として例外を発生させ、動作しないようです。他のオプションフラグはありますか、またはこれを行う方法はありますか?

18
Behzadsh

ドキュメントに基づいて、 'conntinueOnError'オプションを 'ordered'をfalseに設定して置き換えてください。orderedオプションがfalseに設定されている場合、1回の書き込みが失敗してもinsertManyは書き込みを続けます。

ここにドキュメントのリンクがあります: insertMany

14
YouneL