mongoDB之ObjectId
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数据,分成四个部分,其中:
- 前4个字节表示时间戳;
- 接下来的3个字节是机器标识码;
- 紧接的两个字节由进程id组成(PID);
- 最后三个字节是自增计数器生成的随机数;
时间戳
将刚才生成的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相关推荐
- MongoDB SpringBoot ObjectId序列化json为String
mongodb的ObjectId默认序列化为bean对象,如果需要转换为json字符对象,配置如下 @Configuration public class JacksonConfig implemen ...
- python中Mongodb的Objectid 实现
python中Mongodb的Objectid 实现 Mongodb 作为非关系型数据库,默认实现 了Objectid 作为索引,对数据进行排序. ojbectid 组成 在 ObjectId 类中, ...
- php生成objectid,python根据时间生成mongodb的ObjectId的方法
本文实例讲述了python根据时间生成mongodb的ObjectId的方法.分享给大家供大家参考.具体分析如下: mongodb的_id为ObjectId类型,ObjectId内是包含时间戳信息的, ...
- 【知识小课堂】 mongodb 之 objectId
一.OBJECTID 因公司开发人员在使用MONGODB时,总遇到一些小问题.为了增加大家的mongodb 数据库知识. 决定每周进行一.两次的知识小课堂.这里把内容整理出来,上传到博客中.也算是自己 ...
- MongoDB的ObjectId生成原理
在分布式系统中,分布式 ID 有很多特殊的要求,其中两个要求 各个 ID 必须全局唯一,且 ID 能够趋势递增. mongo插入一条记录 db.xttblog.insert({"name&q ...
- 从根上理解MongoDB的ObjectId生成原理!
想写这篇文章好久了,一直抽不出时间.这两天端午节放假,我和娃都泡在图书馆,在他看书的空闲期,我拿出电脑写下了本文. 我们都知道,在分布式系统中,分布式 ID 有很多特殊的要求,其中之二就是要求各个 I ...
- MongoDB 认识ObjectId
官方文档:https://docs.mongodb.com/manual/reference/method/ObjectId/ 现在我们有一个集合如下 db.class0.insertMany([{& ...
- python处理mongodb的ObjectId
主要思路是是ObjectId和str互转 MongDB->Python[ObjectId 2 Str] from bson.objectid import ObjectId a=ObjectId ...
- MongoDB中的_id和ObjectId
_id和ObjectId MongoDB中存储的文档必须有一个"_id"键.这个键的值可以是任何类型的,默认是个ObjectId对象. 在一个集合里面,每个集合都有唯一的" ...
最新文章
- PAT(甲级)2019年春季考试 7-3 Telefraud Detection
- undefined找不到函数情况总结
- redis 服务器/客户端安装与配置
- java实验报告 05 类与_java程序设计类与方法-java实验报告
- AOP实践--利用MVC5 Filter实现登录状态判断
- 重构(Refactoring)技巧读书笔记 之二
- 飞鸽推广的由咪商务微博
- java注入 named_spring @autowired 如何根据bean(@Service)的name来注入
- 模糊PID控制算法 之 C语言实现
- 新手如何使用JavaScript读取json文件
- linux 模板 制作工具,OpenTBS 1.8.0 发布,生成 Office 的模板工具
- 安卓手机通话录音软件
- android mtk 常用修改器,MTK android 可修改IMEI方法
- Xcode常用快捷键
- android第三方好用,有哪些好用的安卓ROM值得推荐?安卓端最好的第三方ROM介绍...
- 下载google drive文件
- android自定义锁屏界面设置,android 锁屏壁纸和桌面壁纸的设置实现
- 申请GitHub学生包,0成本搭建WordPress教程
- Redis中AKF原则的应用
- 跨境电商卖家应该掌握的9种电子邮件创意营销方法
热门文章
- 【笔试与面试】顶点软件群体面试
- 教你怎样删除PDF文件中多余的页面
- java 6 7 区别大吗_java基础(1)-比较jdk5,jdk6,jdk7的新特性
- 如何利用CSS画三角形、圆形、柠檬、小药丸?
- 弹幕、暴漫、有声皮肤:80后眼中的“怪象”正中90后下怀?
- python简单数据类型变量_(八)python的简单数据类型和变量
- 关于使用友盟第三方平台集成第三方分享
- web前端框架Hui使用
- 游龙传说服务器维护,炉石传说2017年服务器故障玩家补偿奖励一览
- android 字体滚动效果,2018-02-05 android 左右字滚动效果(跑马灯效果),能直接拿来用的...