`

MongoDB中的_id和ObjectId

 
阅读更多
_id和ObjectId
MongoDB中存储的文档必须有一个"_id"键。这个键的值可以是任何类型的,默认是个ObjectId对象。
在一个集合里面,每个集合都有唯一的"_id"值,来确保集合里面每个文档都能被唯一标识。如果有
两个集合的话,两个集合可以都有一个值为"123"的"_id"的键,但是每个集合里面只能有一个"_id"
是123的文档。
1.ObjectId
ObjectId是"_id"的默认类型。它设计成轻量型的,不同的机器都能用全局唯一的同种方法方便地生成它。
这是MongoDB采用ObjectId,而不是其他比较常规的做法(比如自动增加的主键)的主要原因,因为在多个
服务器上同步自动增加主键值既费力还费时。MongoDB从一开始就设计用来作为分布式数据库,处理多个节
点是一个核心要求。后面会讲到ObjectId类型在分片环境中容易生成得多。

ObjectId使用12字节的存储空间,每个字节两位十六进制数字,是一个24位的字符串。由于看起来很长,不
少人会觉得难以处理。但关键是要知道这个长长的ObjectId是实际存储数据的两倍长。

如果快速连续创建多个ObjectId,会发现每次只有最后几位数字有变化。另外中间的几位数字也会变化(要
是在创建的过程中停顿几秒钟)。这是ObjectId的创建方式导致的。12字节按照如下方式生成:
      0|1|2|3 | 4|5|6 | 7|8 | 9|10|11
        时间戳 | 机器  | PID | 计数器
前4字节是从标准纪元开始的时间戳,单位为秒。这会带来一些有用的属性。

时间戳,与随后的5个字节组合起来,提供了秒级别的唯一性。
由于时间戳在前,这意味着ObjectId大致会按照插入的顺序排列。这对于某些方面很有用,如将其作为索引提
高效率,但是这个是没有保证的,仅仅是"大致"。这4个字节也隐含了文档创建的时间。绝大多数驱动都会公开
一个方法从ObjectId获取这个信息。

因为使用的是当前时间,很多用户担心要对服务器进行时间同步,其实这个没有必要,因为时间戳的实际值并不
重要,只要其总是不停增加就好了(每秒一次)。

接下来的三个字节是所在主机的唯一标识符。通常是机器主机名的散列值。这样就可以确保不同主机生成不同的
ObjectId,不产生冲突。

为了确保在同一台机器上并发的多个进程产生的ObjectId是唯一的。后3个字节就是一个自动增加的计数器,确
保相同进程同一秒产生的ObjectId也是不一样的。同一秒钟最多允许每个进程拥有256(16777216)个不同的ObjectId。

2.自动生成_id
前面讲到,如果插入文档的时候没有"_id"键,系统会帮你自动创建一个。可以由MongoDB服务器来做这件事情,但
通常会在客户端由驱动程序完成。理由如下:
虽然ObjectId设计成轻量型的,易于生成,但是毕竟生成的时候还是产生开销。在客户端生成体现了MongoDB的设计
理念:能从服务器端转移到驱动程序来做的事,就尽量转移。这种理念背后的原因是,即便是像MongoDB这样的可扩
展数据库,扩展应用层也要比扩展数据库层容易的多。将事务交由客户端来处理,就减轻了数据库扩展的负担。

在客户端生成ObjectId,驱动程序能够提供更加丰富的API。例如,驱动程序可以有自己的insert方法,可以返回生
成的ObjectId,也可以直接将其插入文档。如果驱动程序允许服务器生成ObjectId,那么将需要单独的查询,以确
定插入的文档中的"_id"值。
分享到:
评论

相关推荐

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

    MongoDB里的_id字段前四位是时间戳的16进制表示,通过Python可以很容易从_id中提取出时间戳来 def timestamp_from_objectid(objectid): result = 0 try: result = time.mktime(objectid.generation_time.time...

    mongoDB文件存储_java_MongoDB_

    在Java开发中,MongoDB常被用于处理结构化和半结构化的数据。本篇文章将深入探讨MongoDB如何进行文件存储,特别是针对大文件的处理。 首先,MongoDB提供了GridFS(Grid File System)规范,这是一个用于存储和检索...

    python操作mongodb根据_id查询数据的实现方法

    在MongoDB中,每个文档都有一个默认的、唯一的_id字段,通常由MongoDB自动生成,其类型为ObjectId。ObjectId由12字节组成,包含时间戳、机器标识符、进程ID和随机数,确保其全局唯一性。 在Python中,如果你想要...

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

    mongodb的_id为ObjectId类型,ObjectId内是包含时间戳信息的,这样我们在保存数据的时候就不需要再单独记录一个添加时间了,如果需要按照时间查询,我们可以先把时间变化成可查询的ObjectId,再通过_id字段查询,...

    MongoDB插入文档与ObjectID操作.pdf

    1. **_id 字段**:在 MongoDB 中,每个文档都必须有一个 `_id` 字段,它通常是自动创建的,可以是系统生成的 ObjectId,也可以由用户手动设置。ObjectId 是一种特殊的数据类型,由12字节组成,用于确保文档的唯一性...

    java查询mongodb中的objectid示例

    `ObjectId`是MongoDB中用于唯一标识文档的一种数据类型,通常作为每个文档的默认 `_id` 字段。本示例将详细解释如何使用Java来查询具有指定`ObjectId`的MongoDB文档。 首先,确保你的项目中已经添加了MongoDB的Java...

    mongodb_preview.pdf

    MongoDB中的每个文档都有一个唯一的主键_id字段,通常是用ObjectId()生成的。书中会通过示例来讲解如何设置_id字段。 查询和更新文档是MongoDB中常见的操作。find()方法用于查询文档,MongoDBCursor则用于处理查询...

    MongoDB的ObjectId.pdf

    在 MongoDB 中,每个文档都必须包含一个 `_id` 键,其值可以是任何类型,但默认是 ObjectId。这是因为 ObjectId 提供了一种简单而高效的方式来保证文档的唯一性,尤其是在分布式环境中,无需像传统关系型数据库那样...

    mongodb update操作符ppt

    在PPT中,可能会通过实例、最佳实践和注意事项来详细解释这些操作符的用法和效果,帮助读者深入理解如何有效利用MongoDB更新数据。对于开发者来说,熟练掌握这些操作符对于优化数据管理流程至关重要。

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

    ObjectId介绍在MongoDB中,文档(document)在集合(collection)中的存储需要一个唯一的_id字段作为主键。这个_id默认使用ObjectId来定义,因为ObjectId定义的足够短小,并尽最大可能的保持唯一性,同时能被快速的...

    PHP库 查询Mongodb中的文档ID的方法

    特别强调了如何构造`MongoDB\BSON\ObjectID`实例来处理MongoDB的`_id`字段,并通过`findOne`和`updateOne`方法来检索和更新特定文档。这些操作是开发中处理MongoDB文档常用的技术,对于使用PHP与MongoDB交互的开发...

    MongoDB ObjectId

    MongoDB ObjectId的设计巧妙地结合了时间戳、机器标识和进程信息,以及随机数,既确保了文档的唯一性,又简化了在分布式环境下的操作,是MongoDB数据库体系中的一个重要组成部分。在实际应用中,理解并合理利用...

    前端开源库-meteor-mongo-id

    1. **MongoDB ObjectID**:MongoDB中的每个文档都有一个默认的_id字段,它是BSON(Binary JSON)类型的数据,通常由12字节的十六进制字符串表示,前4字节表示生成时间戳,中间4字节是机器标识,接着2字节是进程ID,...

    详解如何使用MongoDB+Springboot实现分布式ID的方法

    在实现分布式ID时,通常有几种方案:使用数据库自增ID、使用Redis的incr命令、使用UUID、Twitter的snowflake算法、利用Zookeeper生成唯一ID、MongoDB的ObjectId等。每种方案都有其优缺,需要根据实际情况选择合适的...

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

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

    MongoDB中文档的更新操作示例详解

    MongoDB 是一个流行的开源NoSQL数据库系统,以其灵活性和高性能而受到广泛的欢迎。在MongoDB中,文档是数据存储的基本单位,类似于关系型数据库中的行。本篇文章将深入探讨MongoDB中文档的更新操作,包括如何替换...

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

    在MongoDB的应用设计中,设计模式能够帮助开发者更好地组织和管理数据,提高应用程序的性能与可维护性。下面将详细介绍几种常见的MongoDB设计模式及其应用场景。 #### 三、MongoDB设计模式详解 ##### 3.1 嵌入式...

Global site tag (gtag.js) - Google Analytics