`
wangmored
  • 浏览: 165155 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mongodb objectId 解析

阅读更多
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
分享到:
评论

相关推荐

    alfred-workflow-objectid:解析MongoDB ObjectId对象并从中提取信息,例如时间戳,机器哈希等

    阿尔弗雷德工作流程对象这个Alfred Workflow插件可以解析MongoDB ObjectId对象,并从中提取一些基本信息和重要信息,例如生成时间戳,机器哈希等。 注意:目前仅支持生成时提取。 即将发布的版本将支持其他ObjectId...

    深究从MongoDB的ObjectId中获取时间信息

    在MongoDB中,每个文档都有一个默认的主键字段`_id`,其类型为ObjectId。ObjectId是一个12字节的二进制结构,通常用于唯一标识文档。在本文中,我们将深入探讨如何从ObjectId中提取时间信息。 ObjectId的结构如下:...

    python根据时间生成mongodb的ObjectId的方法

    MongoDB中的每个文档都有一个唯一的标识符,这就是`_id`字段,它默认是`ObjectId`类型。`ObjectId`是由12字节(96位)组成的,其中前4个字节表示创建该`ObjectId`的秒数,接下来3个字节是机器标识符,接着两个字节是...

    关于C#生成MongoDB中ObjectId的实现方法

    `TryParse()`方法用于从字符串形式的ObjectId解析回对象,而`DecodeHex()`则负责将十六进制字符串转换为字节数组。 注意,MongoDB驱动库(如MongoDB.Driver)已经包含了完整的ObjectId类实现,包括所有必要的方法和...

    MongoDb数据结构详解.pdf

    4. **_id字段**:每条插入MongoDB的文档都会自动分配一个唯一的`_id`字段,通常由一个ObjectId类型的数据构成。ObjectId由四个部分组成:4字节的时间戳(从1970年1月1日以来的秒数)、3字节的机器标识符、2字节的...

    .NET Core中反解ObjectId

    在.NET Core中,MongoDB驱动程序提供了对ObjectId的处理,ObjectId是MongoDB中用于标识文档的一个特殊类型。...这在微服务架构中尤其有用,因为每个服务可能需要独立生成和解析ObjectId来确保数据的一致性和可追溯性。

    query-parser:对MongoDB查询(过滤器),投影等进行安全的解析和验证

    mongodb查询解析器 对MongoDB查询(过滤器),投影等进行安全的解析和验证。 例子 安全地将一些JS代码作为字符串转换为真正的JS对象,并且不会丢失bson类型: require ( 'mongodb-query-parser' ) ( '{_id: ...

    python将MongoDB里的ObjectId转换为时间戳的方法

    在Python中,我们可以使用`bson.objectid.ObjectId`来创建或解析`ObjectId`。要从`ObjectId`中获取时间戳,我们需要访问其内部属性`generation_time`,这将返回一个`datetime`对象,包含了`ObjectId`生成的时间。...

    MongoDB应用设计模式 高清中文版

    ### MongoDB应用设计模式知识点解析 #### 一、MongoDB简介 MongoDB是一种开源的文档数据库,也是NoSQL数据库的一种。它使用JSON格式的文档作为数据存储单元,支持动态查询、索引、复制等功能,适用于大数据量的...

    mongodb数据库设计

    ### MongoDB数据库设计与NoSQL概念解析 #### 一、引言 MongoDB作为一种流行的NoSQL数据库,因其灵活性、可扩展性和高性能等特点,在处理大规模数据存储和检索方面表现出色。本文将以一个假想的Web应用程序...

    extended-json:在规范上,MongoDB Extended JSON解析和字符串化

    - **ObjectId**:MongoDB的唯一标识符,用`ObjectID()`表示。 - **MongoDB的其他特殊类型,如`DBPointer`、`Code`、`Symbol`等,也有对应的表示方式。 4. **与标准JSON的区别**: 标准JSON并不直接支持MongoDB的...

    MongoDB Java Driver 源码分析(1):Package 概述

    `OpQuery`, `OpInsert`, `OpDelete`等类代表了不同的MongoDB操作符,它们被用来构建网络请求并解析响应。 8. **com.mongodb.util**: 包含了一些通用工具类,如`UUIDHelper`用于处理UUID,`ObjectId`类表示MongoDB的...

    mongodb bson

    它不包含任何与JSON解析或对象映射相关的功能,主要处理与MongoDB服务器的低级别通信,如建立连接、发送请求和接收响应。这个库是所有其他Java驱动组件的基础,允许开发者构建自定义的、高度优化的数据访问层。 `...

    Java程序访问MongoDB

    {"_id":ObjectId("..."),"name":"Hannah","no":2} The Search Query has Executed! ``` #### 五、总结 通过以上步骤,我们不仅了解了如何在本地安装和配置MongoDB,还学会了如何使用Java程序与MongoDB进行交互...

    bson-objectid:在没有mongodb驱动程序或bson模块的情况下构造ObjectID

    该模块允许您创建和解析ObjectID而无需引用或模块。 目标是与所有的公共API实现100%兼容(可在此处找到: : )。 安装 $ npm install bson-objectid 用法 var ObjectID = require ( "bson-objectid" ) ; console ...

    MongoDB 参考文档

    本参考文档旨在深入解析MongoDB的使用方法,涵盖其基本操作到高级功能,是学习与掌握MongoDB不可或缺的资料。 #### 关于MongoDB文档 在文档的第一部分“关于MongoDB文档”中,详细介绍了MongoDB文档的结构、版权、...

    JAVA对MongoDB的操作.doc

    如果在插入时未指定 `_id`,系统会自动生成一个`ObjectId`。 6. **插入操作** - **四种插入数据的方法**: - **方法1**:使用`BasicDBObject`直接创建文档并插入。 ```java DBObject data1 = new BasicDBObject...

Global site tag (gtag.js) - Google Analytics