• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

MongoDB3.2中插入数据前如何去重

php 搞代码 4年前 (2022-01-25) 15次浏览 已收录 0个评论
文章目录[隐藏]

场景描述:

现有类似 {key:"value",key1:"value1"} 这样的文档。
我使用db.collection.insertMany()将文档批量插入到集合之中,例如:

<code>db.collection.insertMany([   {key:"1",key1:"value1"},   {key:"2",key1:"value1"},   {key:"3",key1:"value1"},            ……]);</code>

具体问题描述:

我需要key的值是唯一的,在批量插入的时候自动舍弃掉有重复值的文档。
我有尝试使用db.collection.createIndex({key:1},{unique:true})给这个集合添加 unique 索引,但结果是插入时如果遇到重复值,直接会中断插入并且抛出错误。

问题:

请问在数据库层面有没有解决此问题的办法?
【修改:】请问在数据库层面不将唯一值赋给“_id”有没有解决此问题的办法?
难道只有在语言层面做判断?

附:
db.collection.insertMany文档
unique index 文档

回复内容:

场景描述:

现有类似 {key:"value",key1:"value1"} 这样的文档。
我使用db.collection.insertMany()将文档批量插入到集合之中,例如:

<code>db.collection.insertMany([   {key:"1",key1:"value1"},   {key:"2",key1:"value1"},   {key:"3",key1:"value1"},            ……]);</code>

具体问题描述:

我需要key的值是唯一的,在批量插入的时候自动舍弃掉有重复值的文档。
我有尝试使用db.collection.createIndex({key:1},{unique:true})给这个集合添加 unique 索引,但结果是插入时如果遇到重复值,直接会中断插入并且抛出错误。

问题:

请问在数据库层面有没有解决此问题的办法?
【修改:】请问在数据库层面不将唯一值赋给“_id”有没有解决此问题的办法?
难道只有在语言层面做判断?

附:
db.collection.insertMany文档
unique index 文档

找到目前比较好的办法:

  1. 设置 keyunique index。

  2. 当使用db.collection.insertMany()插入多文档时,使用ordered: false 选项跳过插入错误的文档,不中断插入操作。

  3. 最后对插入重复值抛出的异常做处理。

例如:

此处用 PHP 作为示例。

<code class="php">try {    //首先对 key 字段添加唯一索引    $this->collection->createIndex(['key' => 1], ["unique" => true]);} catch (\MongoDB\Driver\Exception\Exception $e) {    Log::error($e->getMessage());}try {    $result = $this-<span style="color:transparent">本文来源gaodai#ma#com搞*!代#%^码$网!</span><strong>搞代gaodaima码</strong>>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;}</code>

将key的值给_id

你看下你自己附带的文档,里面专门有提到的:

With ordered to false, the insert operation would continue with any remaining documents.

Unordered Inserts

The following attempts to insert multiple documents with _id field and ordered: false. The array of documents contains two documents with duplicate _id fields.

try {
db.products.insertMany( [

<code>  { _id: 10, item: "large box", qty: 20 },  { _id: 11, item: "small box", qty: 55 },  { _id: 11, item: "medium box", qty: 30 },  { _id: 12, item: "envelope", qty: 100},  { _id: 13, item: "stamps", qty: 125 },  { _id: 13, item: "tape", qty: 20},  { _id: 14, item: "bubble wrap", qty: 30}</code>

], { ordered: false } );
} catch (e) {
print (e);
}


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:MongoDB3.2中插入数据前如何去重

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址