美文网首页
MongoDB防止插入重复数据

MongoDB防止插入重复数据

作者: FelixZzzz | 来源:发表于2021-08-16 17:26 被阅读0次

重复数据,指的是某些字段是相同的文档重复插入。也就是说在一个集合里面,某些字段有重复值。

没有并发的环境下

最直接的想法是先查询相关字段,如果查询到,就更新,如果没有查询到就插入。

if db.collection.find(filter).count() == 0:
    db.collection.insert_one(document)
else:
    # 重置更新abbs字段
    db.collection.update_one(filter, update)

或者在使用update_one()操作时,将参数upsert设置为true。该设置会查找有没有匹配的文档,有的话就更新,没有的话就插入。如果upsert为默认值false时,如果没有找到匹配的文档,并不会执行插入。

db.collection.update_one(filter, update, upsert=true)

但是这两种操作并不原子,也就是说,存在并发的场景下,可能出现冲突。upsert设置为trueupdate函数也不是线程安全的。多个命令同时进行,都没有查询到匹配的文档时,会都执行插入,这样就会有多个文档了。

存在并发的环境下

想要解决这个问题,我们需要建立唯一索引,这样就不会有重复插入的情况了。

db.collection.createIndex( <key and index type specification>, { unique: true } )
# 单一字段索引
db.collection.createIndex({key:1},{unique:true}
# 组合字段索引
db.collection.createIndex({key_one:1,key_two:1},{unique:true})

然后直接尝试插入或者更新,抛出异常的时候再次使用更新即可。

try:
    db.collection.insert_one(document)
except DuplicateKeyError:
    db.collection.update_one(filter, update)

或者:

try:
    db.collection.update_one(filter, update, upsert=true)
except DuplicateKeyError:
    db.collection.update_one(filter, update, upsert=true)

upsert的官方说明

参数说明

如果该参数设置为true,则在没有文档匹配查询条件时创建新文档。默认值为false,当没有找到匹配项时,它不会插入新文档。

关于重复数据的说明

为了避免多次插入同一个文档,只有在查询字段是唯一索引的情况下才使用upsert: true

给定一个名为people的集合,其中没有文档的name字段持有值Andy。考虑当多个客户端同时发出以下upsert: true的更新时。

db.people.update(
   { name: "Andy" },
   {
      name: "Andy",
      rating: 1,
      score: 1
   },
   { upsert: true }
)

如果所有的update()操作都在任何客户端成功插入数据之前完成了查询部分,并且在name字段上没有唯一索引,那么每次update操作都可能导致插入。

为了防止MongoDB不止一次地插入同一个文档,请在name字段上创建一个唯一索引。有了唯一索引,如果多个应用程序以upsert: true发出同一个更新,只会有一个update()成功插入一个新文档。

可能的剩余操作:

  • 更新最新插入的文件,或者
  • 试图插入一个重复的文档时失败。
    如果操作因为重复的索引键错误而失败,应用程序可以重试操作,该操作将作为更新操作成功。

相关文章

  • MongoDB防止插入重复数据

    重复数据,指的是某些字段是相同的文档重复插入。也就是说在一个集合里面,某些字段有重复值。 没有并发的环境下 最直接...

  • MariaDB 防止数据重复插入

    在数据插入时,进行重复性判断,若不存在,则插入,若存在,则不插入,具体示例: sql示例: insert into...

  • MongoDB学习笔记

    MongoDB只能插入字典 MongoDB插入数据 db.collection.insert()插入数据,_id存...

  • Sqlite 防止插入重复数据

    在SQLITE中,可以用以下方法防止插入重复数据,1.设置表的联合主键2.在INSERT语句中添加OR IGNOR...

  • mongodb及express框架(0812)

    安装mongodb mongodb增删改查操作 插入数据 查询数据 插入多条数据 切换数据库并进入 test 修改...

  • MongoDB删除重复数据

    使用MongoDB存储爬取到信息,但是由于考虑不周,没有对重复的数据进行去重后才插入数据库,导致有很多重复的数据,...

  • MongoDB的增删改查

    1.MongoDB的插入文档 MongoDB使用insert()和save()插入文档数据插入语法 实例 如果我们...

  • Mongodb基本操作

    mongodb数据库管理: Mongodb插入文档: Mongodb更新文档 Mongodb删除文档: Mongo...

  • how to solve mongodb key contain

    mongodb 插入数据,数据中含有dot,mongodb 报错 springboot解决方式:不走springb...

  • 22.Mongodb的的增删改查

    Mongodb的的增删改查 学习目标 掌握 mongodb插入数据的方法 掌握 mongodb保存数据的方法 掌握...

网友评论

      本文标题:MongoDB防止插入重复数据

      本文链接:https://www.haomeiwen.com/subject/bifvbltx.html