2016-11-25 1 views
5

mongo php library을 사용하고 mongodb에 이전 데이터를 삽입하려고합니다. 난 insertMany() 메서드를 사용하고 고유 색인에 중복 문서가있을 수 있습니다 문서의 거대한 배열을 전달합니다. 중복 문서가 있다면mongodb PHP 라이브러리에서 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" 
    } 
] 

, MongoDB\Driver\Exception\BulkWriteException 올리고 프로세스를 중지합니다 :

내가 사용자 컬렉션이 이러한 인덱스를 가지고 있다고 할 수 있습니다. 중복 문서 삽입을 무시하고 예외 발생을 방지하고 다른 문서를 계속 삽입하는 방법을 찾고 싶습니다.

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) 
); 

내가 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 옵션을 false로 설정하면 문서에 따라 주문 옵션을 false로 설정하여 insertMany가 단일 쓰기가 실패하더라도 계속 쓰기를 시도합니다. 여기

는 문서가 링크되어 insertMany

관련 문제