首页 > 其他分享 >mongo踩坑-upsert插入重复数据

mongo踩坑-upsert插入重复数据

时间:2022-11-26 22:57:48浏览次数:72  
标签:mongo 索引 重复 插入 数据 upsert

在线上环境碰到一张 mongo 表里有重复数据,最终追溯到了 node mongo 插入数据那里,发现了 mongo 的 upsert 并非是线程安全的,在并发的情况下会产生重复数据。后面查阅 monog 的文档,也指出了使用 upsert 方法时要给表加上唯一索引。

Upsert with Unique Index

When using the upsert: true option with the update() method, and not using a unique index on the query field(s), multiple instances of a update() operation with similar query field(s) could result in duplicate documents being inserted in certain circumstances.

我一般都是这样子创建唯一索引:
db.collection.createIndex(unique_keys, { backgroud : true, unique : true})

这里也分析一下为啥 upsert 会产生重复数据吧。是因为 upsert 操作不是原子性的,upsert 分为俩步:

  • 找数据
  • 覆盖数据或插入数据

在并发下,多个线程同时 upsert 并完成找数据这一步操作,此时这些线程都没有找到数据,然后都进行插入数据的操作,于是重复数据便产生了。解决这一问题的方案有俩种,一种是给表加唯一索引,另外一种是给 upsert 这俩部操作加上一个写锁。

总结
以后用 mongo 时,尽量给每张表都加上唯一索引吧,有重复数据的时候还得先去重才能建索引,太麻烦了,不如一开始就建好唯一索引。

标签:mongo,索引,重复,插入,数据,upsert
From: https://www.cnblogs.com/meicanhong/p/16928553.html

相关文章

  • 05-2-海量数据如何提供毫秒级查询(1) MongoDB数据库 explan优化分析 没用
                       ......
  • Python - 处理mongodb
    windows安装mongodb下载地址:https://www.mongodb.com/try/download/communitytips:不下载这个图形化工具,可能会很慢:配置环境变量到PathE:\mongodb\bin......
  • 20.MongoDB
    MongoDB安装MongoDB官方网站:https://www.mongodb.com/try/download/community-kubernetes-operator2软件安装step1:以管理员的身份打开安装包直接点击Nextstep2:继续......
  • Mac上安装mongoDB详细教程
    MacOSX平台安装MongoDBMongoDB提供了OSX平台上64位的安装包,你可以在官网下载安装包。下载地址:https://www.mongodb.com/download-center#community 从Mongo......
  • Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析
    摘要:一、问题:      数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求。 二、解决方案:   1.通过高速服务器Cache......
  • MongoDB - 事务支持
    事务简介事务是数据库中处理的逻辑单元,每个事务中包括一个或多个数据库操作,既可以是读操作,也可以是写操作。ACID是一个“真正”事务所需要具备的一组属性集合,指的是原子......
  • centos 7 YUM 安装mongodb 3.4
    第一步查看是否存在Mongodb配置yum源切换到yum目录cd/etc/yum.repos.d/查看文件ls第二部不存在添加yum源创建文件touchmongodb-3.4.repo编辑该文件vimongodb-3.4.......
  • leetcode_Day2_35搜索插入位置
    1.题目  2.解一 主要思路:二分法,不多赘述,为题目所给标准解法。3.解二   主要思路:循环对比,自己想的,感觉写的非常冗余,内存占用和速度都很大。不过没学过算法,......
  • Spring Boot MongoDB How to remove _class from spring data mongodb collection
    摘要:在使用SpringBoot整合Mongodb的过程中,在做insert对象的时候,在Collection中会出现一个_class字段属性,出现这个问题的原因是在调用mongoTemplate的insert方法时,spring-......
  • 利用直接插入排序进行将数组序列从小到大排序
    1题目功能:直接插入排序描述:利用直接插入排序进行将数组序列从小到大排序2思路原始顺序:34,12,45,3,8,23,89,52,24,10在代码中将数组a[0]置为监视哨......