Я использую 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
]);
Код выше еще поднять исключение, и, кажется, не работает , Есть ли другой флаг опции или есть ли способ сделать это?
Можете ли вы быть более конкретными как это то, что, кажется, не работает? Вы можете добавить пример, который поможет нам понять. – Veeram
@ Veeram более подробно и пример добавлен по мере запроса – Behzadsh