mongodb出现id重复问题的简单解决办法

目录
  • 背景
  • ObjectId 的结构
  • 尝试
  • 解决办法
  • 总结

背景

今天遇到mongodb在插入数据时出现id重复错误,具体错误代码如下:

duplicate key error collection: index: id dup key: { : ObjectId(‘59a3b9275f063c20cc8bdec7') }',

觉得奇怪 id不是自己生成的,怎么会这样呢 。

于是查了下ObjectId 。

ObjectId 的结构

这些是 _id 的一些主要特征的摘要:

_id 是集合中文档的主键,用于区分文档(记录)。

_id自动编入索引。指定 { _id: } 的查找将 _id 索引作为其指南。

默认情况下,_id 字段的类型为 ObjectID,是 MongoDB 的 BSON 类型之一。如果需要,用户还可以将 _id 覆盖为 ObjectID 以外的其他内容。

ObjectID 长度为 12 字节,由几个 2-4 字节的链组成。每个链代表并指定文档身份的具体内容。以下的值构成了完整的 12 字节组合:

一个 4 字节的值,表示自 Unix 纪元以来的秒数

一个 3 字节的机器标识符

一个 2 字节的进程 ID

一个 3 字节的计数器,以随机值开始

通常,如果文档尚未分配 _id 值,MongoDB 将自动生成一个 _id 值。

尝试

我的代码大概是这样的 ,批量插入

   Collectwrite.InsertMany(item);

后面测试了下干脆改成单个添加

    foreach(var item in list)

    {

  Collectwrite.InsertOne(item);

  }

也是报错。

   Collectwrite.InsertOne(item);

                Thread.Sleep(500);

再后来降速添加,错误依旧。

解决办法

百度了一下,发现很多人都出现了类似问题,数据库的id是根据 时间戳+主机+进程号+序列生成的。重复的原因可能有两种:

内部原因:同时插入两条数据,导致数据库生成了同一个id值。

外部原因:每次使用同一个变量存储不同的数据,导致数据库认为每次存储的是同一条数据,最终生成同一个id值。

以上都有个共同点,就是让数据库自己生成id值。于是干脆换个思路

自己手动添加id值,当插入的数据带有_id的字段时,mongodb就不再自动生成id。至此, mongodb重复id的问题就解决了。  item.Id = ObjectId.GenerateNewId().ToString();

    Collectwrite.DeleteMany(x => x.SeasonId == seasonId);
            foreach(var item in list)

            {

                item.Id = ObjectId.GenerateNewId().ToString();

                Collectwrite.InsertOne(item);

                Thread.Sleep(500);

            }

        }

总结

到此这篇关于mongodb出现id重复问题的简单解决办法的文章就介绍到这了,更多相关mongodb id重复解决内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Mongodb自增id实现方法

    本文实例讲述了Mongodb自增id实现方法.分享给大家供大家参考,具体如下: 首先创建一个自动增长id集合 ids >db.ids.save({name:"user", id:0}); 可以查看一下是否成功 > db.ids.find(); { "_id" : ObjectId("4c637dbd900f00000000686c"), "name" : "user", "id&quo

  • mongodb出现id重复问题的简单解决办法

    目录 背景 ObjectId 的结构 尝试 解决办法 总结 背景 今天遇到mongodb在插入数据时出现id重复错误,具体错误代码如下: duplicate key error collection: index: id dup key: { : ObjectId('59a3b9275f063c20cc8bdec7') }', 觉得奇怪 id不是自己生成的,怎么会这样呢 . 于是查了下ObjectId . ObjectId 的结构 这些是 _id 的一些主要特征的摘要: _id 是集合中文档的主

  • Mongodb 副本集搭建问题总结及解决办法

    Mongodb 副本集搭建问题总结及解决办法 Mongodb数据库的副本集是由多台服务器组成,基中一台是主节点,其它为从节点,如果主节点宕机就自动切换到任意一个从节点.如果以前的主节点修复完成和正常运行就自动变成从节点,从节点不能查询数据.也可以在一台服务器装多个Mongodb端口不一样. 在我以往的认知中,一个系统一旦正式上线,多半不会轻易的迁移服务器,尤其是那种涉及到多个关联应用,涉及到多台硬件服务器的系统,因为这种迁移将是牵一发而动全身的. 但是,却仍然有这种情况存在,就如我这几天主要负责

  • JQuery 传送中文乱码问题的简单解决办法

    一.客户端先进行编码,服务端再解码. 客户端发送数据: var names = encodeURIComponent("电费"); names = encodeURIComponent( names); $.post("test.do?names="+name,null, function(){}); 服务端解码: 获取names 参数值,然后解码. String name = URLDecoder.decode(names, "UTF-8");

  • npm run dev失败的简单解决办法

    目录 记录学习TS和Vue过程中遇到的问题及解决办法 解决办法: 总结 记录学习TS和Vue过程中遇到的问题及解决办法 下载好相关依赖包后,每次npm run dev时,都会出现以下问题: 输入yes进行下载,但是不会下载成功.输入NO则会直接结束,不会执行. 于是我根据yes之后的报错信息,去到log里面查看 嗯,看了半天没看懂! 于是我就查看依赖包的版本号是否有问题,版本号如下: 于是根据版本号再到处收集相关信息,终于找到问题了! 我们报错的提示是webpack-cli这个包出现了问题,问你

  • 使用distinct在mysql中查询多条不重复记录值的解决办法

    在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值.其原因是distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的.所以我花了很多时间来研究这个问题,网上也查不到解决方案,期间把容容拉来帮忙,结果是

  • 提示iis 无法启动World Wide Web Publishing服务的解决办法

    启动FTP Publishing服务也出现同样的提示.晕倒,然后打开其属性看看服务依存关系,可是其所依存的服务我已全部开启,还是不行,然后百度谷歌一顿搜,结果搜了半天,按那些解决方法试了都不行,正要绝望之时,突然发现一篇Vinzip blog 文之巴博客的文章,然后按照他的方法弄好之后,重新计算机!YES!OK了,看来还是这个人有水平,文章转贴如下: "一大早来到公司,我打开电脑发现部署在我本机上Web程序无法打开.我第一个想到的是可能IIS没有启动.于是打开控制面板->管理工具 ->

  • 关于mongoose连接mongodb重复访问报错的解决办法

    具体代码如下所示: var express = require('express'); var mongoose = require('mongoose'); var router = express.Router(); var Person = mongoose.model('Person',{ id:Number, name:String }); /*新增*/ router.get('/insert', function(req, res){ var student = new Person

  • Python+MongoDB自增键值的简单实现

    背景 最近在写一个测试工具箱,里面有一个bug记录系统,因为后台我是用Django和MongoDB来实现的,就遇到了一个问题,要如何实现一个自增的字段. 传统的关系型数据库要实现起来是非常容易,只要直接设置一个自增字段就行了,插入数据时不用管这个键值,只管自己处理的数据就行了,会自动实现自增的功能,但是非关系型数据库好像没有这个功能(或者我不知道).百度之后发现都是MongoDB的设置方法,并不是我想要的. 解决思路 百度没有找到好的思路,那就只能自己解决了,我的想法很简单,字段不会自增,那么就

  • Java中防止数据重复提交超简单的6种方法

    目录 前言 模拟用户场景 前端拦截 后端拦截 1.基础版--HashMap 2.优化版--固定大小的数组 3.扩展版--双重检测锁(DCL) 4.完善版--LRUMap 5.最终版--封装 扩展知识--LRUMap 实现原理分析 总结 前言 有位朋友,某天突然问东哥:在 Java 中,防止重复提交最简单的方案是什么? 这句话中包含了两个关键信息,第一:防止重复提交:第二:最简单. 于是东哥问他,是单机环境还是分布式环境? 得到的反馈是单机环境,那就简单了,于是东哥就开始装*了. 话不多说,我们先

  • 系统高吞吐量下的数据库重复写入问题分析解决

    目录 问题分析 数据库上解决 从程序上保证数据不重复 总结 问题分析 为了提高系统的吞吐量,很多环节下对于数据库的写入是多线程,甚至是多进程的.为了保证写入成功,在很多情况下需要多次重试.这就会带来一个问题,数据重复,同一条数据会被记录多次.有些情况下数据重复无伤大雅,但是很多情况系统是无法容忍数据重复的.因此这个问题需要解决.我个人觉得解决这一问题有两个方向:第一,从数据库上保证数据不重复,第二,从程序上保证数据不重复. 数据库上解决 主要包括:主键,唯一性索引,甚至是临时表.程序上解决无非就

随机推荐