• 售前

  • 售后

热门帖子
入门百科

mongodb出现id重复题目的简单办理办法

[复制链接]
123457281 显示全部楼层 发表于 2022-1-7 11:26:25 |阅读模式 打印 上一主题 下一主题
目次


  • 配景
  • ObjectId 的结构
  • 尝试
  • 办理办法
  • 总结

配景

本日遇到mongodb在插入数据时出现id重复错误,具体错误代码如下:
  1. 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 值。

尝试

我的代码大概是如许的 ,批量插入
  1.    Collectwrite.InsertMany(item);
复制代码
后面测试了下干脆改成单个添加
  1.     foreach(var item in list)
  2.     {
  3.   Collectwrite.InsertOne(item);
  4.   }
复制代码
也是报错。
  1.    Collectwrite.InsertOne(item);
  2.                 Thread.Sleep(500);
复制代码
再厥后降速添加,错误依旧。

办理办法

百度了一下,发现许多人都出现了类似问题,数据库的id是根据 时间戳+主机+历程号+序列天生的。重复的原因大概有两种:
内部原因:同时插入两条数据,导致数据库天生了同一个id值。
外部原因:每次利用同一个变量存储差异的数据,导致数据库以为每次存储的是同一条数据,终极天生同一个id值。
以上都有个共同点,就是让数据库本身天生id值。于是干脆换个思路
本身手动添加id值,当插入的数据带有_id的字段时,mongodb就不再自动天生id。至此, mongodb重复id的问题就办理了。  item.Id = ObjectId.GenerateNewId().ToString();
  1.     Collectwrite.DeleteMany(x => x.SeasonId == seasonId);            foreach(var item in list)            {                item.Id = ObjectId.GenerateNewId().ToString();                Collectwrite.InsertOne(item);
  2.                 Thread.Sleep(500);            }                    }
复制代码
总结

到此这篇关于mongodb出现id重复问题的简单办理办法的文章就先容到这了,更多相干mongodb id重复办理内容请搜索草根技术分享以前的文章或继承欣赏下面的相干文章盼望各人以后多多支持草根技术分享!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作