服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - MongoDB - mongodb出现id重复问题的简单解决办法

mongodb出现id重复问题的简单解决办法

2022-01-25 17:45conan MongoDB

近期在使用mongodb的过程中遇到一次表中有_id字段重复的记录(相同_id的有两条),着实吓了一大跳,这篇文章主要给大家介绍了关于mongodb出现id重复问题的简单解决办法,需要的朋友可以参考下

背景

今天遇到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
2
3
4
5
6
7
  foreach(var item in list)
 
  {
 
Collectwrite.InsertOne(item);
 
}

也是报错。

?
1
2
3
Collectwrite.InsertOne(item);
 
             Thread.Sleep(500);

再后来降速添加,错误依旧。

解决办法

百度了一下,发现很多人都出现了类似问题,数据库的id是根据 时间戳+主机+进程号+序列生成的。重复的原因可能有两种:

内部原因:同时插入两条数据,导致数据库生成了同一个id值。

外部原因:每次使用同一个变量存储不同的数据,导致数据库认为每次存储的是同一条数据,最终生成同一个id值。

以上都有个共同点,就是让数据库自己生成id值。于是干脆换个思路

自己手动添加id值,当插入的数据带有_id的字段时,mongodb就不再自动生成id。至此, mongodb重复id的问题就解决了。  item.Id = ObjectId.GenerateNewId().ToString();

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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重复解决内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://mp.weixin.qq.com/s/TbA-78p-gDljLVgKJN42pw

延伸 · 阅读

精彩推荐
  • MongoDBMongodb如何开启用户访问控制详解

    Mongodb如何开启用户访问控制详解

    默认启动 MongoDB 服务时没有任何参数,可以对数据库任意操 作,而且可以远程访问数据库,所以推荐开发阶段可以不设置任何参数,但对于生产环境还是要...

    不争5402020-05-10
  • MongoDB将MongoDB加入到Windows的本地服务项的方法

    将MongoDB加入到Windows的本地服务项的方法

    下面主要针对MongoDB在Windows下加入本地服务项做一些简单的分享。以方便刚接触MongoDB并在Windows环境下进行开发的同学 ...

    MongoDB教程网3012020-04-28
  • MongoDBMongoDB简单操作示例【连接、增删改查等】

    MongoDB简单操作示例【连接、增删改查等】

    这篇文章主要介绍了MongoDB简单操作,涉及命令行窗口下使用MongoDB进行简单的连接、增删改查等相关操作技巧,需要的朋友可以参考下 ...

    tinyphp2982020-05-23
  • MongoDBMongoDB 学习笔记

    MongoDB 学习笔记

    最近在学习MongoDB,小结一下,主要都是一些基础知识,需要的朋友可以参考下 ...

    服务器之家3412020-04-25
  • MongoDBMongoDB分片测试

    MongoDB分片测试

    分片是mongoDB扩展的一种方式。分片分割一个collection并将不同的部分存储在不同的机器上,本文给大家介绍MongoDB分片测试,需要的朋友参考下吧 ...

    我思,故我在5532020-05-05
  • MongoDBMongo服务重启异常问题的处理方法

    Mongo服务重启异常问题的处理方法

    这篇文章主要给大家介绍了关于Mongo服务重启异常问题的处理方法,这个问题其实还是挺常见的,通过此文学习处理方法,以后遇到了就不会措手不及的,需要的...

    Leafage11842021-08-24
  • MongoDBMongodb数据库误删后的恢复方法(两种)

    Mongodb数据库误删后的恢复方法(两种)

    本文给大家分享两种方法来实现Mongodb数据库误删后的恢复,每种方法给大家介绍的都非常详细,需要的朋友参考下吧 ...

    fyg05249922020-05-18
  • MongoDBMongoDB 简单入门教程(安装、基本概念、创建用户)

    MongoDB 简单入门教程(安装、基本概念、创建用户)

    这篇文章主要介绍了MongoDB 简单入门教程(安装、基本概念、创建用户)的相关资料,帮助大家更好的理解和学习使用MongoDB数据库,感兴趣的朋友可以了解下...

    AsiaYe6352021-05-10