`
mywebcode
  • 浏览: 999118 次
文章分类
社区版块
存档分类
最新评论

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...

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

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

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

    主要介绍了python操作mongodb根据_id查询数据的实现方法,实例分析了Python根据pymongo不同版本操作ObjectId的技巧,需要的朋友可以参考下

    MongoDB ObjectId

    在前面几个章节中我们已经使用了MongoDB 的对象 Id(ObjectId)。 在本章节中,我们将了解的ObjectId的结构。 ObjectId 是一个12字节 BSON 类型数据,有以下格式: 前4个字节表示时间戳 接下来的3个字节是机器标识码 ...

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

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

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

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

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

    MongoDB默认使用_id字段作为主键,类型为ObjectId。ObjectId的生成有一定的规则,详情可以查看这篇文章MongoDB深究之ObjectId

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

    require ( 'mongodb-query-parser' ) ( '{_id: ObjectId("58c33a794d08b991e3648fd2")}' ) ; // >>> {_id: ObjectId('58c33a794d08b991e3648fd2'x)} 与Codemirror结合使用 var parser = require ( 'mongodb-query-...

    Mongodb自增id实现方法

    本文实例讲述了Mongodb自增id实现方法。分享给大家供大家参考,具体如下: 首先创建一个自动增长id集合 ids >db.ids.save({name:"user", id:0}); 可以查看一下是否成功 > db.ids.find(); { "_id" : ObjectId("4c...

    MongoDB的Python接口pymorm.zip

    > User(_id=ObjectId('5519e5eb5dde7310f04d9bbe'), happiness=u'poor', username=u'Test')  > User(_id=ObjectId('5519e5eb5dde7310f04d9bbe'), happiness=u'a lot!', username=u'Walter') 标签:...

    MongoDB聚合分组取第一条记录的案例与实现方法

    前言 今天开发同学向我们提了一个紧急的需求,从集合mt_resources_access_log中,根据字段refererDomain分组,取分组中... "_id" : ObjectId("5c1e23eaa66bf62c0c390afb"), "_class" : "C1", "resourceUrl" : "/st

    mongo-objectid:基于MongoDB规范的ObjectID

    目标是提供正确的MongoDB ObjectID实现,以确保不可能在快速生成时创建类似的条目(如在其他开源软件包中所见) 目录 安装 npm install mongo-objectid 用法 mkdir myproject cd myproject npm init npm install ...

    MongoDB 自动增长

    counters 集合中实现_id字段自动增长。 使用 counters 集合 考虑以下 products 文档。我们希望 _id 字段实现 从 1,2,3,4 到 n 的自动增长功能。 { "_id":1, "product_name": "Apple iPhone", "c

    MongoDB 聚合

    MongoDB 聚合 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。... _id: ObjectId(7df78ad8902c) title: 'MongoDB Overview', descr

    Node.js使用MongoDB的ObjectId作为查询条件的方法

    当往MongoDB中插入一条数据时,会自动生成ObjectId作为数据的主键。 那么如何通过ObjectId来做数据的唯一查询呢? 在MongoDB中插入一条数据 在MongoDB中插入一条如下结构的数据: { _id: 5d6a32389c825e24106624...

    mongodb实现数组对象求和方法实例

    前言 mongodb在计算集合数组值时候,我们通常会想到使用$... _id : ObjectId(5c414a6a0847e00385143003), date : 2019-01-18 09, data : [ { app_platform : ios, user : 3028 }, { app_platform : android

    MongoDB权威指南(中文版)高清

    152.6.1 基本数据类型 152.6.2 数字 172.6.3 日期 182.6.4 数组 192.6.5 内嵌文档 192.6.6 _id和ObjectId 20第3章 创建、更新及删除文档 233.1 插入并保存文档 233.1.1 批量插入 233.1.2 插入:...

    电子书:MongoDB权威指南(中文版)

    182.6.4 数组 192.6.5 内嵌文档 192.6.6 _id 和ObjectId 20第3 章 创建、更新及删除文档 233.1 插入并保存文档 233.1.1 批量插入 233.1.2 插入:原理和作用 243.2 删除文档 243.3 更新文档 253.3....

    php实现Mongodb自定义方式生成自增ID的方法

    { “_id” : ObjectId(“4c637dbd900f00000000686c”), “name” : “user”, “id” : 0 } //然后每次添加新用户之前自增一下 ids集合 获得id >userid = db.ids.findAndModify({update:{$inc:{

Global site tag (gtag.js) - Google Analytics