2016-11-25 6 views
5

Я использую mongo php library и пытаюсь вставить некоторые старые данные в mongodb. Я использовал метод insertMany() и передал огромный массив документов, которые могут иметь дубликаты документов по уникальным индексам.как игнорировать дубликаты документов при использовании insertMany в php-библиотеке mongodb?

Допустим, у меня есть коллекция пользователей и эти показатели:

[ 
    { 
     "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 бы поднять и остановить процесс. Я хочу найти способ игнорировать вставку дубликатов документов (а также предотвращение повышения из-за исключения) и продолжать вставлять другие документы.

Я нашел в документации 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 
]); 

Код выше еще поднять исключение, и, кажется, не работает , Есть ли другой флаг опции или есть ли способ сделать это?

+0

Можете ли вы быть более конкретными как это то, что, кажется, не работает? Вы можете добавить пример, который поможет нам понять. – Veeram

+0

@ Veeram более подробно и пример добавлен по мере запроса – Behzadsh

ответ

3

Попробуйте заменить параметр «conntinueOnError» на «ordered», установленным на false, на основе документации, когда для параметра заказа установлено значение false, insertMany продолжит запись, даже если одна запись завершится с ошибкой.

здесь Документы ссылка: insertMany