2016-11-25 14 views
5

Tôi đang sử dụng mongo php library và cố gắng chèn một số dữ liệu cũ vào mongodb. Tôi đã sử dụng phương pháp insertMany() và chuyển một mảng tài liệu khổng lồ, có thể có tài liệu trùng lặp trên các chỉ mục duy nhất.làm thế nào để bỏ qua các tài liệu trùng lặp khi sử dụng insertMany trong thư viện php mongodb?

phép nói rằng tôi có một bộ sưu tập người dùng và có những chỉ số:

[ 
    { 
     "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" 
    } 
] 

Nếu có một tài liệu trùng lặp, MongoDB\Driver\Exception\BulkWriteException sẽ tăng và ngăn chặn quá trình này. Tôi muốn tìm cách bỏ qua chèn tài liệu trùng lặp (và cũng ngăn chặn ngoại lệ tăng) và tiếp tục chèn các tài liệu khác.

Tôi tìm thấy trong php.net làm tài liệu cờ được gọi là continueOnError làm thủ thuật nhưng có vẻ như nó không hoạt động với thư viện này.

Ví dụ từ 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) 
); 

Và cách tôi cố gắng sử dụng cờ với 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 
]); 

Đoạn mã trên vẫn nâng cao ngoại lệ, và dường như không làm việc . Có cờ tùy chọn khác hoặc có cách nào để thực hiện việc này không?

+0

Bạn có thể cụ thể hơn vì điều gì có vẻ không hoạt động? Bạn có thể thêm một ví dụ để giúp chúng tôi hiểu. – Veeram

+0

@Veeram biết thêm chi tiết và ví dụ được thêm khi bạn yêu cầu – Behzadsh

Trả lời

3

Hãy thử thay thế tùy chọn 'conntinueOnError' bằng 'đặt hàng' thành false, dựa trên tài liệu, khi tùy chọn đặt hàng được đặt thành false, hàm insertMany sẽ tiếp tục viết, ngay cả khi một lần viết không thành công.

đây là liên kết tài liệu: insertMany

Các vấn đề liên quan