阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

快速解决mongodb出现id重复问题

103次阅读
没有评论

共计 1298 个字符,预计需要花费 4 分钟才能阅读完成。

导读 近期在使用 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 重复问题的简单解决办法的文章就介绍到这了

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1298字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中