近期在使用mongodb的过程中遇到一次表中有_id字段重复的记录(相同_id的有两条),着实吓了一大跳,这篇文章主要给大家介绍了关于mongodb出现id重复问题的简单解决办法,需要的朋友可以参考下
背景
今天遇到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重复解决内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:mongodb出现id重复问题的简单解决办法


- redis清除数据 2023-09-13
- Mongodb启动报错完美解决方案:about to fork child process,waiting until server is ready for connections. 2023-07-16
- Numpy中如何创建矩阵并等间隔抽取数据 2023-07-28
- 在阿里云CentOS 6.8上安装Redis 2023-09-12
- MySQL8.0.28安装教程详细图解(windows 64位) 2023-07-26
- Oracle 删除大量表记录操作分析总结 2023-07-23
- 搭建单机Redis缓存服务的实现 2023-07-13
- SQLSERVER调用C#的代码实现 2023-07-29
- 基于Python制作一个简单的文章搜索工具 2023-07-28
- SQL Server 2022 AlwaysOn新特性之包含可用性组详解 2023-07-29