2016-11-25 28 views
5

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?

+0

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

+0

@Veeram więcej szczegółów i przykład został dodany zgodnie z życzeniem – Behzadsh

Odpowiedz

3

Spróbuj zastąpić opcję "conntinueOnError" przez "zamówiony" zestaw na false, w oparciu o dokumentację, gdy opcja zamówiona jest ustawiona na wartość false, funkcja insertMany będzie kontynuować pisanie, nawet jeśli pojedynczy zapis nie powiedzie się.

Oto docs link: insertMany