在 mongodb php 库中使用 insertMany 时如何忽略重复文档?
how to ignore duplicate documents when using insertMany in mongodb php library?
我正在使用 mongo php library,并试图将一些旧数据插入 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"
}
]
如果存在重复文档,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' => '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
]);
上面的代码仍然引发异常,而且似乎不起作用。
是否有其他选项标志或有什么方法可以做到这一点?
尝试将 'continueOnError' 选项替换为 'ordered' 设置为 false,根据文档,当 ordered 选项设置为 false 时,insertMany 将继续写入,即使单次写入失败。
这是文档 link:insertMany
我正在使用 mongo php library,并试图将一些旧数据插入 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"
}
]
如果存在重复文档,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' => '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
]);
上面的代码仍然引发异常,而且似乎不起作用。 是否有其他选项标志或有什么方法可以做到这一点?
尝试将 'continueOnError' 选项替换为 'ordered' 设置为 false,根据文档,当 ordered 选项设置为 false 时,insertMany 将继续写入,即使单次写入失败。
这是文档 link:insertMany