mongodb出现重复id怎么办?

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: mongodb出现重复id怎么办?

这个问题是我带的徒弟今天遇到的,程序在向mongodb中插入数据时出现id重复的错误,出错的提示如下:

duplicate key error collection: index: id dup key: { : ObjectId(‘68a3c9271f063c20cf82dec9’) }’,

看到这个错误提示你一定会很奇怪id不是自己生成的,怎么会重复呢?要解答这个问题,我们先来看一下ObjectId以及什么是id。


id是集合中文档的主键,用于区分文档,它自动编入索引,并且指定 {id:} 查找是以id索引作为指南的。默认情况下id字段的类型为ObjectId,它是MongoDB的BSON类型之一。如果用户需要还可以将id设置为为ObjectId以外的其他类型。


ObjectId长度为12个字节,由几个2到4字节的链组成。每一个链代表并指定文档身份的具体内容。下面就列出了完整的12个字节组合:


  1. 4字节的值表示自Unix纪元以来的秒数;
  2. 3字节的机器标识符;
  3. 2字节的进程id;
  4. 3字节的计数器,它以随机值开始。


一般来说,如果文档尚未分配id值,则MongoDB将会自动生成一个id值。我们先来尝试解决一下这个问题,首先我想到的解决方案是这样的:


1.首先我们的代码时批量插入的

Collectwrite.InsertMany(item);

2. 我们把它改成循环,每次只添加一个

foreach(var item in list)
{
  Collectwrite.InsertOne(item);
}

但是运行代码还是报错,那么我们在每次田间后都暂停500毫秒呢?

Collectwrite.InsertOne(item);
Thread.Sleep(500);

再次运行代码,还是同样的错误。那么这是怎么回事呢?很多情况下id是根据时间戳+主机+进程号+序列生成的,那么重复的原因可能有以下两种:


  1. 同一时间插入了两条数据,导致了数据库生成了同一个id值;
  2. 每次使用同一个变量存储不同的数据,进而导致mangodb认为每次存储的是同一条数据,最终生成同一个id值。


这两种原因都有个共同点,那就是让mongodb自己生成id。那么我们可以不让mongodb自己生成id,我们自己手动添加id,当插入的数据带有id的字段时,mongodb就不再自动生成id。至此, mongodb重复id的问题就解决了。解决代码如下:

Collectwrite.DeleteMany(x => x.SeasonId == seasonId);
foreach(var item in list)
{
  item.Id = ObjectId.GenerateNewId().ToString();
  Collectwrite.InsertOne(item);
  Thread.Sleep(500);
}
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
SQL 存储 NoSQL
MongoDB:21-MongoDB-自增Id
MongoDB:21-MongoDB-自增Id
574 0
MongoDB:21-MongoDB-自增Id
|
NoSQL MongoDB 数据库
分布式服务器框架之Server.Core库中实现YFUniqueEntity、YFUniqueIDBase 管理MongoDB 自定义Id的自增
YFUniqueEntity是数据库中的结构,GetUniqueID函数中会根据Type和自增步长去数据库中寻找该类型的当前ID是多少,然后会用当前的Id去加上步长,把更新后的新ID插入到MongoDB中记录着ID的那张表里。
|
SQL NoSQL MongoDB
分布式服务器框架之Servers.Core库中实现MongoDB对象实体类 管理对象ID
MongoDB中的ID是一个hash码,和传统的关系数据库相比MongoDB没有办法实现ID的自增,如果需要ID自增的话,所以要自己管理ID,并且把对应类型的ID写入到一个专门的Collection(其实就是Sql中的Table)里面去,每次创建新对象的时候,都要取到该类型当前的ID,然后在这个基础上+1,比如当前是角色的ID是1,又创建了一个新的角色,要在原来的基础上+1 ID=2。今天先把MongoDB的对象实体基类实现了。
|
JSON NoSQL Java
在java项目中的mongodb的_id被fastjson转为json时竟然丢失了
fastjson是阿里开发的一个javaBean和json解析器和封装器(源码位置),用过几次感觉挺好用的,也是国人的开源项目当然得支持,但最近项目在使用mongodb作为数据库时出现了_id丢失的问题,现将我遇到的问题和解决办法展示一下。 现将错误的程序代码添加上,然后再提供解决方法: package org.jivesoftware.openfire.plugin.f
2923 0
|
3天前
|
存储 NoSQL MongoDB
MongoDB如何创建数据库
MongoDB如何创建数据库
|
3天前
|
JSON NoSQL MongoDB
理解Nosql数据库的mongodb
【5月更文挑战第5天】MongoDB是2009年发布的一款通用型NoSQL数据库,结合了关系模型和NoSQL的优点,适用于各种现代应用。其特点包括图形界面、数据服务、云基础设施集成(AWS, Azure, Google Cloud)。它具备全面的查询能力、ACID事务、可调整的一致性保证,并有多语言驱动及工具,可在任何地方运行。
29 4