Używam mongo php library i próbuję wstawić kilka starych danych do mongodb. Użyłem metody insertMany()
i przekazałem ogromny wachlarz dokumentów, które mogą zawierać zduplikowane dokumenty na unikatowych indeksach.jak zignorować duplikaty dokumentów podczas korzystania z insertMany w bibliotece php mongodb?
Powiedzmy mam zbiór użytkowników i mieć te indeksy:
[
{
"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"
}
]
Jeśli istnieje duplikat dokumentu, MongoDB\Driver\Exception\BulkWriteException
podniesie i zatrzymać proces. Chcę znaleźć sposób, aby zignorować wstawianie duplikatów dokumentów (a także zapobieganie podnoszeniu wyjątków) i kontynuować wstawianie innych dokumentów.
Znalazłem w dokumentację pod flagą o nazwie continueOnError
, która rozwiązuje problem, ale wygląda na to, że nie działa z tą biblioteką.
Przykład z 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)
);
i sposobu próbowałem użyć flagi z 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
]);
Powyższy kod jeszcze podnieść wyjątek, a nie wydaje się działać . Czy jest inna flaga opcji lub czy jest jakiś sposób na zrobienie tego?
Czy można być bardziej szczegółowe, jak to, co wydaje się być nie działa? Możesz dodać przykład, który pomoże nam zrozumieć. – Veeram
@Veeram więcej szczegółów i przykład został dodany zgodnie z życzeniem – Behzadsh