mongdb中的_id

MongoDB中数据的基本单元称为文档(Document)。文档是MongoDB的核心概念,多个键极其关联的值有序的放置在一起便是文档。

在一个特定集合内部,需要唯一的标识文档。因此MongoDB中存储的文档都由一个"_id"键,用于完成此功能。这个键的值可以是任意类型的,默认试ObjectId对象。ObjectId对象的生成思路是本文的主题,也是很多分布式系统可以借鉴的思路。

为了考虑分布式,“_id”要求不同的机器都能用全局唯一的同种方法方便的生成它。因此不能使用自增主键(需要多台服务器进行同步,既费时又费力),因此选用了生成ObjectId对象的方法。(类似GUID生成机制)

ObjectId使用12字节的存储空间,其生成方式如下:

|0|1|2|3|4|5|6 |7|8|9|10|11|

|时间戳  |机器ID|PID|计数器   |

前四个字节时间戳是从标准纪元开始的时间戳,单位为秒,有如下特性:

  1. 时间戳与后边5个字节一块,保证秒级别的唯一性;
  2. 保证插入顺序大致按时间排序;
  3. 隐含了文档创建时间;

时间戳的实际值并不重要,不需要对服务器之间的时间进行同步(因为加上机器ID和进程ID已保证此值唯一,唯一性是ObjectId的最终诉求)。

机器ID是服务器主机标识,通常是机器主机名的散列值。

同一台机器上可以运行多个mongod实例,因此也需要加入进程标识符PID。

前9个字节保证了同一秒钟不同机器不同进程产生的ObjectId的唯一性。后三个字节是一个自动增加的计数器(一个mongod进程需要一个全局的计数器),保证同一秒的ObjectId是唯一的。同一秒钟最多允许每个进程拥有(256^3 = 16777216)个不同的ObjectId。

总结一下:时间戳保证秒级唯一,机器ID保证设计时考虑分布式,避免时钟同步,PID保证同一台服务器运行多个mongod实例时的唯一性,最后的计数器保证同一秒内的唯一性(选用几个字节既要考虑存储的经济性,也要考虑并发性能的上限)。

"_id"既可以在服务器端生成也可以在客户端生成,在客户端生成可以降低服务器端的压力。如果是服务器上运行时,推荐由服务器脚本生成,降低数据库压力,如果是C/S模式,那就由客户端生成。

时间: 2024-08-11 20:11:09

mongdb中的_id的相关文章

MongoDB中的_id和ObjectId

ObjectId是"_id"的默认类型.它设计成轻量型的,不同的机器都能用全局唯一的同种方法方便地生成它. 这是MongoDB采用ObjectId,而不是其他比较常规的做法(比如自动增加的主键)的主要原因,因为在多个 服务器上同步自动增加主键值既费力还费时.MongoDB从一开始就设计用来作为分布式数据库,处理多个节 点是一个核心要求.后面会讲到ObjectId类型在分片环境中容易生成得多. ObjectId使用12字节的存储空间,每个字节两位十六进制数字,是一个24位的字符串.由于看

mongodb中的_id的ObjectId的生成规则

MongoDB中存储的文档必须有一个"_id" .这个键值可以是任何类型,默认是ObjectID对象.在一个集合里,每个文档都有一个唯一的“_id”,确保集合里的每个文档都能被唯一标示. ObjectID使用12字节的存储空间,是一个由24个16进制数字组成的字符串. ObjectId的12个字节按照如下方式生成 时间戳(1571234567123) 机器码(主机标识符) PID(进程id) 计数器 0,1,2,3 4,5,6 7,8 9,10,11 前四位是时间戳,可以提供秒级别的唯

mongdb分片原理以及分片副本集群搭建

mongdb分片原理分片,是指将数据拆分,将其分散到不同的机器上,分片类似于raid0,副本类似于raid1MongoDB的副本集与我们常见的主从有所不同,主从在主机宕机后所有服务将停止 分片集群主要由三种组件组成:mongos,config server,shard1) mongos (路由进程, 应用程序接入 mongos 再查询到具体分片)数据库集群请求的入口,所有的请求都通过 mongos 进行协调,不需要在应用程序添加一个路由选择器,mongos 自己就是一个请求分发中心,它负责把对应

Mongdb事务和原子操作

首先,原则上说Mongdb没有事务的概念. 事务有ACID的概念,比如原子性,一个事务要么全部成功,要么全部失败. 如,考虑一个转账的业务,从A转账100到B,将分为两步: A = A - 100; B = B + 100; 在Mongdb中,如果A = A - 100;执行完,将会直接入库生效,没有回滚段的概念,所以如果此时B = B + 100;出现了问题,是不能回滚上一步A的操作的.所以说,Mongdb是没有原子性的. 然后说一致性,简单的来说读一致性,Mongdb都无法保证.Mongdb

对MongoDB中的数据进行搜索(2)

MongoDB在大多数的情形中都是作为数据存储的模块而被使用,作为一个数据库,一般不应该承担更多的任务. 从专业性的角度来说,将文本搜索的任务交由专业的搜索引擎来负责,往往是更好的选择. 常用的搜索引擎与MongoDB往往都有着现成的工具,可以方便的进行结合. 1.Sphinx与mongodb-sphinx Sphinx是一个C++编写的文本搜索引擎,其本身与MySQL结合的非常好,可以非常方便的从MySQL中导入数据. 对于其他的数据库来说,Sphinx并不提供原生的支持,但是Sphinx提供

Android中的Adapter总结

一.Adapter的介绍 An Adapter object acts as a bridge between an AdapterView and the underlying data for that view. The Adapter provides access to the data items. The Adapter is also responsible for making a View for each item in the data set. 一个Adapter是Ad

Android学习四、Android中的Adapter

一.Adapter的介绍 An Adapter object acts as a bridge between an AdapterView and the underlying data for that view. The Adapter provides access to the data items. The Adapter is also responsible for making a View for each item in the data set. 一个Adapter是Ad

MongoDB数据库设计中6条重要的经验法则

Part 1 原文:6 Rules of Thumb for MongoDB Schema Design: Part 1 By William Zola, Lead Technical Support Engineer at MongoDB “我有丰富的sql使用经验,但是我是个MongoDB的初学者.我应该如何在MongoDB中针对一对多关系进行建模?”这是我被问及最多的问题之一. 我没法简单的给出答案,因为这有很多方案去实现.接下来我会教导你如何针对一对多进行建模. 这个话题有很多内容需要讨

mongodb 数据更新与_id之间的故事

今天在对接接口的时候遇到一些问题,因为之前为了方便验证接口写的对不对是往数据库里面自己插的一些数据,刚开始用的时候还用的不亦乐乎,后来遇到更新的时候出错了. 比如我们这个APP是个医疗APP刚开始注册的时候默认都为病人,如下 当有医生想要在这个APP注册赚钱的时候需要注册提交自己的信息,如下 然后按道理来说会注册成功但是却报After applying the update to the document {_id: 3 , ...}, the (immutable) field \'_id\'