问 题
场景描述:
现有类似 {key:"value",key1:"value1"} 这样的文档。
我使用db.collection.insertMany()将文档批量插入到集合之中,例如:
db.collection.insertMany([
{key:"1",key1:"value1"},
{key:"2",key1:"value1"},
{key:"3",key1:"value1"},
……
]);
具体问题描述:
我需要key的值是唯一的,在批量插入的时候自动舍弃掉有重复值的文档。
我有尝试使用db.collection.createIndex({key:1},{unique:true})给这个集合添加 unique 索引,但结果是插入时如果遇到重复值,直接会中断插入并且抛出错误。
问题:
请问在数据库层面有没有解决此问题的办法?
【修改:】请问在数据库层面不将唯一值赋给“_id”有没有解决此问题的办法?
难道只有在语言层面做判断?
解决方案
找到目前比较好的办法:
设置 key 为 unique index。
当使用db.collection.insertMany()插入多文档时,使用ordered: false 选项跳过插入错误的文档,不中断插入操作。
最后对插入重复值抛出的异常做处理。
例如:
此处用 PHP 作为示例。
try {
//首先对 key 字段添加唯一索引
$this->collection->createIndex(['key' => 1], ["unique" => true]);
} catch (\MongoDB\Driver\Exception\Exception $e) {
Log::error($e->getMessage());
}
try {
$result = $this->collection->insertMany(
$data,
['ordered' => false] //跳过插入错误
);
} catch (\MongoDB\Driver\Exception\BulkWriteException $e) {
/*如果有重复数据插入,将抛出 BulkWriteException */
$result = $e->getWriteResult();
$writeErrors = $result->getWriteErrors();
$errorsAmount = count($writeErrors); //插入错误的数量
Log::info($errorsAmount . '条重复数据未插入!');
} catch (\MongoDB\Driver\Exception\Exception $e) {
Log::error($e->getMessage());
exit;
}
扫一扫关注IT屋
微信公众号搜索 “ IT屋 ” ,选择关注与百万开发者在一起