在MongoDB中,如果不特别指定,每个文档都会生成一个唯一的ObjectId作为其主键_id的值。这个值是一个看似随机的串。这个串到底是什么值?为什么MongoDB要使用这个值作为默认主键?它内部又包含了什么样的信息?如果你还不了解,就请看下面文章吧。
感谢刘浩@人民搜索的投稿。
MongoDB中数据的基本单元称为文档(Document)。文档是MongoDB的核心概念,多个键极其关联的值有序的放置在一起便是文档。
在一个特定集合内部,需要唯一的标识文档。因此MongoDB中存储的文档都由一个”_id”键,用于完成此功能。这个键的值可以是任意类型的,默认试ObjectId对象。ObjectId对象的生成思路是本文的主题,也是很多分布式系统可以借鉴的思路。
为了考虑分布式,“_id”要求不同的机器都能用全局唯一的同种方法方便的生成它。因此不能使用自增主键(需要多台服务器进行同步,既费时又费力),因此选用了生成ObjectId对象的方法。
ObjectId使用12字节的存储空间,其生成方式如下:
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
时间戳 |
机器ID |
PID |
计数器 |
前四个字节时间戳是从标准纪元开始的时间戳,单位为秒,有如下特性:
- 时间戳与后边5个字节一块,保证秒级别的唯一性;
- 保证插入顺序大致按时间排序;
- 隐含了文档创建时间;
机器ID是服务器主机标识,通常是机器主机名的散列值。
同一台机器上可以运行多个mongod实例,因此也需要加入进程标识符PID。
前9个字节保证了同一秒钟不同机器不同进程产生的ObjectId的唯一性。后三个字节是一个自动增加的计数器(一个mongod进程需要一个全局
的计数器),保证同一秒的ObjectId是唯一的。同一秒钟最多允许每个进程拥有(256^3 = 16777216)个不同的ObjectId。
总结一下:时间戳保证秒级唯一,机器ID保证设计时考虑分布式,避免时钟同步,PID保证同一台服务器运行多个mongod实例时的唯一性,最后的计数器保证同一秒内的唯一性(选用几个字节既要考虑存储的经济性,也要考虑并发性能的上限)。
“_id”既可以在服务器端生成也可以在客户端生成,在客户端生成可以降低服务器端的压力。
http://blog.nosqlfan.com/html/3511.html
分享到:
相关推荐
MongoDB是一种流行的开源、分布式文档型数据库,以其灵活性、高性能和易用性而备受开发者青睐。作为NoSQL数据库的一种,它存储数据的方式不同于传统的表结构,而是采用键值对、文档、集合的形式。MongoDB的官方中文...
### Spring Data MongoDB中文文档知识点概览 #### 一、Spring Data MongoDB概述 - **Spring Data MongoDB** 是 **Spring Data** 家族的一员,它提供了一种简单的方式来与 MongoDB 数据库进行交互。通过 Spring Data...
MongoDB是一个高性能、开源、无模式的分布式文档型数据库,它以其灵活性和可扩展性受到青睐。而PHP作为服务器端脚本语言,因其易学易用性而广受欢迎,因此将PHP与MongoDB结合,可以构建高效的数据驱动应用。 本文档...
- **Document-Oriented Datastore**:强调MongoDB作为文档型数据库的核心特性及其优势。 - **Structuring Data for Mongo**:指导开发者如何根据业务需求合理设计数据结构,以提高存储效率和查询性能。 - **Storing ...
2.了解NoSQL和文档数据库 3.要求 4.其他帮助资源 4.1。支持 4.1.1。社区论坛 4.1.2。专业支持 4.2。发展之后 5.新&值得注意的 5.1。Spring Data MongoDB 2.1中的新特性 5.2。Spring Data MongoDB 2.0中的新特性 5.3...
MongoDB 是一种基于分布式文件存储的开源文档型数据库系统,设计初衷是为了解决传统关系型数据库在处理大规模非结构化数据时存在的局限性。与传统的表格型数据存储方式不同,MongoDB 中的数据是以 BSON(Binary JSON...
### Spring MongoDB 参考文档中文版关键知识点概览 #### 1. 了解Spring - **SpringData**:利用Spring框架的核心功能如IoC容器、类型转换系统等。 - **核心概念**:虽然不需要深入了解Spring API的具体细节,但对...
**mongoDB说明文档知识点解析** MongoDB是一种非关系型数据库,属于NoSQL家族的一员,以其高性能、高可用性以及灵活性而著称。本说明文档旨在深入解析MongoDB的关键概念、使用规则及其在不同领域的应用实践。 ### ...
在设计 MongoDB 文档模式时,应优先考虑内嵌,尽可能地遵循对象模型。对于一对一、一对多关系,可以直接在一个文档内表示。当数据量过大超出单个文档限制时,可以使用引用策略。然而,引用可能导致性能下降和事务性...
mongodb 文档
MongoDB是一种流行的开源文档型数据库,它以JSON格式存储数据,具有高性能、高可用性和可扩展性。在C++环境中,开发人员可以使用MongoDB的C++驱动程序来与数据库进行交互,实现数据的存取操作。本编译文档将详细介绍...
MongoDB 3.6 中文文档
MongoDB是一种流行的开源、分布式文档数据库,被广泛用于存储非结构化和半结构化数据。在Java开发中,MongoDB提供了丰富的驱动程序,使得与Java应用程序的集成变得简单高效。本压缩包“MongoDB学习文档.zip”包含了...
2. **集合与文档**:在MongoDB中,数据被组织成集合(类似于关系数据库中的表),而集合由一系列文档组成。每个文档都是一个键值对的集合,这些键值对定义了数据的结构。 3. **CRUD操作**:MongoDB提供了创建...
mongo mongodb nosql 数据库 bson
MongoDB是一种流行的开源文档型数据库,它在IT领域中被广泛应用,特别是在处理大规模、非结构化数据时。作为NoSQL数据库的一员,MongoDB提供了一种灵活、高性能且可扩展的解决方案,与传统的基于表格的关系数据库...
mongodb分片配置.docx Mongodb.chm mongodb安装以及基本操作.docx MongoDB使用手册.doc mongo分布式研究.docx 有这5个文档足够学习Mongodb使用了
MongoDB 3.4 中文文档 2017.5.6 MongoDB 3.4 中文文档 2017.5.6
**Spring MongoDB 中文文档** MongoDB 是一个高性能、开源、无模式的分布式文档数据库,而Spring Data MongoDB 是Spring 框架的一部分,它为MongoDB 提供了强大的支持,简化了与MongoDB 的集成和操作。这篇文档将...
通过这些内容,可以看出SpringData MongoDB API文档是一个功能全面且内容丰富的资源,它不仅包括了API的使用,还包括了最佳实践和设计指南,旨在帮助开发者高效地使用Spring框架与MongoDB数据库进行交互。