ObjectId的组成
首先通过终端命令行,向mongodb的collection中插入一条不带“_id”的记录。然后,通过查询刚插入的数据,发现自动生成了一个objectId,4e7020cb7cac81af7136236b。具体操作如图1
“4e7020cb7cac81af7136236b”这个24位的字符串,虽然看起来很长,也很难理解,但实际上它是由一组十六进制的字符构成,每个字节两位的十六进制数字,总共用了12字节的存储空间。相比MYSQL int类型的4个字节,MongoDB确实多出了很多字节。不过按照现在的存储设备,多出来的字节应该不会成为什么瓶颈。不过MongoDB的这种设计,体现着空间换时间的思想。官网中对ObjectId的规范,如图2所示。
图2 官网对ObjectId的规范
1) Time
时间戳。将刚才生成的objectid的前4位进行提取“4e7020cb”,然后按照十六进制转为十进制,变为“1315971275”,这个数字就是一个时间戳。通过时间戳的转换,就成了易看清的时间格式,如图3所示。
图3 时间戳的转换
2) Machine
机器。接下来的三个字节就是“7cac81”,这三个字节是所在主机的唯一标识符,一般是机器主机名的散列值,这样就确保了不同主机生成不同的机器hash值,确保在分布式中不造成冲突,这也就是在同一台机器生成的objectId中间的字符串都是一模一样的原因。
3) PID
进程ID。上面的Machine是为了确保在不同机器产生的objectId不冲突,而pid就是为了在同一台机器不同的mongodb进程产生了objectId不冲突,接下来的“af71”两位就是产生objectId的进程标识符。
4) INC
自增计数器。前面的九个字节是保证了一秒内不同机器不同进程生成objectId不冲突,这后面的三个字节“36236b”是一个自动增加的计数器,用来确保在同一秒内产生的objectId也不会发现冲突,允许256的3次方等于16777216条记录的唯一性。
总的来看,objectId的前4个字节时间戳,记录了文档创建的时间;接下来3个字节代表了所在主机的唯一标识符,确定了不同主机间产生不同的objectId;后2个字节的进程id,决定了在同一台机器下,不同mongodb进程产生不同的objectId;最后通过3个字节的自增计数器,确保同一秒内产生objectId的唯一性。ObjectId的这个主键生成策略,很好地解决了在分布式环境下高并发情况主键唯一性问题,值得学习借鉴。
参考 http://www.mongodb.org/display/DOCS/Object+IDs
分享到:
相关推荐
对mongodb的objectid生成机制进行分析
MongoDB ObjectId 在前面几个章节中我们已经使用了MongoDB 的对象 Id(ObjectId)。 在本章节中,我们将了解的ObjectId的结构。 ObjectId 是一个12字节 BSON 类型数据,有以下格式: 前4个字节表示时间戳 接下来的3个...
阿尔弗雷德工作流程对象这个Alfred Workflow插件可以解析MongoDB ObjectId对象,并从中提取一些基本信息和重要信息,例如生成时间戳,机器哈希等。 注意:目前仅支持生成时提取。 即将发布的版本将支持其他ObjectId...
一个用于创建非常难以猜测的 MongoDB ObjectID 的 NodeJS 模块 安装 安装很容易。 只需发出 NPM 安装命令: $ npm install mongo-roid 用法 使用几乎和安装一样简单。 var randomOID = require ( 'mongo-roid' ...
MongoDB默认使用_id字段作为主键,类型为ObjectId。ObjectId的生成有一定的规则,详情可以查看这篇文章MongoDB深究之ObjectId
主要介绍了python根据时间生成mongodb的ObjectId的方法,涉及Python操作mongodb数据库的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
主要介绍了java查询mongodb中的objectid示例,需要的朋友可以参考下
MongoDB的ObjectId.pdf 学习资料 复习资料 教学资源
由于几乎所有表都对另一个表有某种引用,因此我们需要在增量 Postgres-ID 和新的 MongoDB ObjectId 之间进行映射,以方便更新。 我们的小 NodeJS 后台任务来了! 它使用 Postgres 内置的触发/侦听功能侦听 ...
@ meanie / joi-object-id Joi扩展程序可将ISO日期字符串自动转换为object-id对象特征扩展现有的string验证器将传入值验证为MongoDB ObjectId值自动将值转换为Mongoose ObjectId实例安装# npmnpm install @meanie/...
GraphQLObjectId mongodb ObjectId的GraphQL标量类型。例子const { GraphQLObjectType, GraphQLString } = require('graphql')const GraphQLObjectId = require('graphql-scalar-objectid')const UserType = new ...
本篇文章小编为大家介绍,关于C#生成MongoDB中ObjectId的实现方法。需要的朋友参考下
基于MongoDB规范的ObjectID实现 目标是提供正确的MongoDB ObjectID实现,以确保不可能在快速生成时创建类似的条目(如在其他开源软件包中所见) 目录 安装 npm install mongo-objectid 用法 mkdir myproject cd ...
如果您是与MongoDb ObjectId纠缠的人,那么hacken也可以简化工作。内容对象功能isObjValid 检查ObjectId是否有效。 var hacken = require ( 'hacken' ) ;if ( hacken . isObjValid ( objid ) ) {console . log ( ...
主要介绍了MongoDB中ObjectId的误区及引起的一系列问题,非常不错,具有参考借鉴价值,需要的朋友可以参考下
主要介绍了Node.js使用MongoDB的ObjectId作为查询条件的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
MongoDB插入文档与ObjectID操作.pdf 学习资料 复习资料 教学资源
云时代的MongoDB Atlas技术解析.pptx