как игнорировать дубликаты документов при использовании insertMany в библиотеке php mongodb?
Я использую библиотека php mongo, и пытается вставить некоторые старые данные в 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"
}
]
если есть дубликат документа, MongoDBDriverExceptionBulkWriteException
поднимет и остановит процесс. Я хочу найти способ игнорировать вставку дубликатов документов (а также предотвращение исключения raise) и продолжить вставку других документов.
Я нашел в 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)
);
и, как я пытался использовать флаг с библиотека php mongo:
<?php
$users = (new MongoDBClient)->test->users
$collection->insertMany([
[
'username' => 'admin',
'email' => 'admin@example.com',
'name' => 'Admin User',
],
[
'username' => 'test',
'email' => 'test@example.com',
'name' => 'Test User',
],
[
'username' => 'test 2',
'email' => 'test@example.com',
'name' => 'Test User 2',
],
],
[
'continueOnError' => true // This option is not working
]);
код выше по-прежнему вызывает исключение и, похоже, не работает. Есть ли другой вариант флага или есть какой-либо способ этого?
1 ответов
попробуйте заменить параметр "conntinueOnError" на "ordered", установленный в false, на основе документации, когда параметр ordered установлен в false, insertMany продолжит запись, даже если одна запись завершится неудачно.
вот ссылка на документы:insertMany