mongoDB之ObjectId

一、ObjectId介绍

    我们在使用mongodb插入数据时,每个document中必须有一个_id字段,且可以是任意类型,但如果没有单独设置_id字段,mongo会自动生成一个_id字段,类型是ObjectId,查看数据显示如下:

{"_id": ObjectId("61cd13eb5b834a603764af44"),"age": 12,"name": "zhangsan","classId": "61c16dffbd33627bc4fbbafe"
}

    “61cd13eb5b834a603764af44”这个24位的字符串,实际上是由一组十六进制的字符构成,总共用了12字节的存储空间。相比MYSQL int类型的4个字节,MongoDB确实多出了很多字节。但是按照现在的设备配置,多出的字节数并不会成为瓶颈,这也体现了体现MongoDB空间换时间的设计思想。

二、ObjectId组成

ObjectId是一个12个字节的BSON数据,分成四个部分,其中:

  1. 前4个字节表示时间戳;
  2. 接下来的3个字节是机器标识码;
  3. 紧接的两个字节由进程id组成(PID);
  4. 最后三个字节是自增计数器生成的随机数;

时间戳

    将刚才生成的objectid的前4位进行提取“61cd13eb”,然后按照十六进制转为十进制,变为“1640829931”,这个数字就是一个精确到秒时间戳。

机器标识码

    接下来的三个字节就是“5b834a”,这三个字节是所在主机的唯一标识符,一般是机器主机名的散列值,这样就确保了不同主机生成不同的机器hash值,确保在分布式中不造成冲突,这也就是在同一台机器生成的objectId中间的字符串都是一模一样的原因。

进程PID

    上面的【机器标识码】是为了确保在不同机器产生的objectId不冲突,而pid就是为了在同一台机器不同的mongodb进程产生了objectId不冲突,接下来的“6037”两位就是产生objectId的进程标识符。

自增计数器

    前面的九个字节是保证了一秒内不同机器不同进程生成objectId不冲突,这后面的三个字节“64af44”是一个自动增加的计数器,用来确保在同一秒内产生的objectId也不会发现冲突,允许256的3次方等于16777216条记录的唯一性。

    ObjectId的这个主键生成策略,很好解决了在分布式环境下高并发情况主键唯一性问题。

三、ObjectId常见问题

ObjectId的值总体上呈递增趋势,但不是绝对的

    ObjectId前4个字节存的是时间戳,而时间是递增的,所以ObjectId总体保证递增的顺序。
    存储的时间戳只精确到秒,在同一台机器不同的MongoDB进程,同一秒内生成的ObjectId,进程ID小的会排在大的前面。存在这种情况,进程ID大的先生成ObjectId,但还是会排在进程ID小的后面。所以ObjectId递增不是绝对的。

ObjectId在一秒内生成的数量是有限的

    3个字节所能表达的最大的整数:2^24-1。所以一个MongoDB进程,在一秒内最多能生成 2^24-1 个ObjectId。从目前机器的性能来看,要超过这个限制几乎是不可能的。

ObjectId的唯一性

    ObjectId近似唯一,理论上会出现很小概率(1/(2^24-1))的重复情况,这取决于MongoDB驱动实现ObjectId方式。以C#官方驱动来说,构成ObjectId的计数器,C#使用Interlocked.Increment实现,保证了同一MongoDB进程在同一秒内生成的多个ObjectId的计数器是累加的,从而保证了生成的ObjectId是唯一的。
    不过,有些版本的驱动是使用了随机数作为计数器,这种情况下并不能保证生成的ObjectId是唯一的。所以,除非你使用的是一个非常老的版本,或者很小众的驱动,否则都不需要为重复的ObjectId担心。

mongoDB之ObjectId相关推荐

  1. MongoDB SpringBoot ObjectId序列化json为String

    mongodb的ObjectId默认序列化为bean对象,如果需要转换为json字符对象,配置如下 @Configuration public class JacksonConfig implemen ...

  2. python中Mongodb的Objectid 实现

    python中Mongodb的Objectid 实现 Mongodb 作为非关系型数据库,默认实现 了Objectid 作为索引,对数据进行排序. ojbectid 组成 在 ObjectId 类中, ...

  3. php生成objectid,python根据时间生成mongodb的ObjectId的方法

    本文实例讲述了python根据时间生成mongodb的ObjectId的方法.分享给大家供大家参考.具体分析如下: mongodb的_id为ObjectId类型,ObjectId内是包含时间戳信息的, ...

  4. 【知识小课堂】 mongodb 之 objectId

    一.OBJECTID 因公司开发人员在使用MONGODB时,总遇到一些小问题.为了增加大家的mongodb 数据库知识. 决定每周进行一.两次的知识小课堂.这里把内容整理出来,上传到博客中.也算是自己 ...

  5. MongoDB的ObjectId生成原理

    在分布式系统中,分布式 ID 有很多特殊的要求,其中两个要求 各个 ID 必须全局唯一,且 ID 能够趋势递增. mongo插入一条记录 db.xttblog.insert({"name&q ...

  6. 从根上理解MongoDB的ObjectId生成原理!

    想写这篇文章好久了,一直抽不出时间.这两天端午节放假,我和娃都泡在图书馆,在他看书的空闲期,我拿出电脑写下了本文. 我们都知道,在分布式系统中,分布式 ID 有很多特殊的要求,其中之二就是要求各个 I ...

  7. MongoDB 认识ObjectId

    官方文档:https://docs.mongodb.com/manual/reference/method/ObjectId/ 现在我们有一个集合如下 db.class0.insertMany([{& ...

  8. python处理mongodb的ObjectId

    主要思路是是ObjectId和str互转 MongDB->Python[ObjectId 2 Str] from bson.objectid import ObjectId a=ObjectId ...

  9. MongoDB中的_id和ObjectId

    _id和ObjectId MongoDB中存储的文档必须有一个"_id"键.这个键的值可以是任何类型的,默认是个ObjectId对象. 在一个集合里面,每个集合都有唯一的" ...

最新文章

  1. PAT(甲级)2019年春季考试 7-3 Telefraud Detection
  2. undefined找不到函数情况总结
  3. redis 服务器/客户端安装与配置
  4. java实验报告 05 类与_java程序设计类与方法-java实验报告
  5. AOP实践--利用MVC5 Filter实现登录状态判断
  6. 重构(Refactoring)技巧读书笔记 之二
  7. 飞鸽推广的由咪商务微博
  8. java注入 named_spring @autowired 如何根据bean(@Service)的name来注入
  9. 模糊PID控制算法 之 C语言实现
  10. 新手如何使用JavaScript读取json文件
  11. linux 模板 制作工具,OpenTBS 1.8.0 发布,生成 Office 的模板工具
  12. 安卓手机通话录音软件
  13. android mtk 常用修改器,MTK android 可修改IMEI方法
  14. Xcode常用快捷键
  15. android第三方好用,有哪些好用的安卓ROM值得推荐?安卓端最好的第三方ROM介绍...
  16. 下载google drive文件
  17. android自定义锁屏界面设置,android 锁屏壁纸和桌面壁纸的设置实现
  18. 申请GitHub学生包,0成本搭建WordPress教程
  19. Redis中AKF原则的应用
  20. 跨境电商卖家应该掌握的9种电子邮件创意营销方法

热门文章

  1. 【笔试与面试】顶点软件群体面试
  2. 教你怎样删除PDF文件中多余的页面
  3. java 6 7 区别大吗_java基础(1)-比较jdk5,jdk6,jdk7的新特性
  4. 如何利用CSS画三角形、圆形、柠檬、小药丸?
  5. 弹幕、暴漫、有声皮肤:80后眼中的“怪象”正中90后下怀?
  6. python简单数据类型变量_(八)python的简单数据类型和变量
  7. 关于使用友盟第三方平台集成第三方分享
  8. web前端框架Hui使用
  9. 游龙传说服务器维护,炉石传说2017年服务器故障玩家补偿奖励一览
  10. android 字体滚动效果,2018-02-05 android 左右字滚动效果(跑马灯效果),能直接拿来用的...