良许Linux教程网 干货合集 mongodb出现id重复问题解决方法

mongodb出现id重复问题解决方法

近期在使用mongodb的过程中遇到一次表中有*id字段重复的记录(相同*id的有两条),着实吓了一大跳,这篇文章主要给大家介绍了关于mongodb出现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重复问题的简单解决办法的文章就介绍到这了

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部
关注公众号
【良许Linux】
回复1024
获取 
99G Linux
从菜鸡到大神
VIP资源课程
关注公众号
【良许Linux】
回复1024
获取 
99G Linux
从菜鸡到大神
VIP资源课程