文档章节

Mongo之ObjectId原理(学习笔记)

ND小龙
 ND小龙
发布于 2017/08/14 00:40
字数 703
阅读 22
收藏 0

ObjectId

    ObjectId 是"_id" 的默认类型。它设计成轻量型的,不同的机器都能用全局唯一的同种方法方便地生成它。这时MongoDB 采用ObjectId,而不是其他比较常规的做法(比如自动增加的主键)的主要原因。

    MongoDB 从一开始就设计用来作为分布式数据库,处理多个节点是一个核心要求。最重要的是ObjectId 类型在分片环境中容易生成。

    ObjectId 使用12 字节的存储空间,每个字节两位十六进制数字,是一个24 位的字符串。

    

    前4 个字节是从标准纪元开始的时间戳,单位为秒。这会带来一些有用的属性。时间戳,与随后的. 5 个字节组合起来,提供了秒级别的唯一性。

    这4 个字节也隐含了文档创建的时间。绝大多数驱动都会公开一个方法从ObjectId 获取这个信息。

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

 

    前9 字节保证了同一秒钟不同机器不同进程产生的ObjectId 是唯一的。后3 字节就是一个自动增加的计数器,确保相同进程同一秒产生的ObjectId 也是不一样的。同一秒钟最多允许每个进程拥有2563(16 777 216)个不同的ObjectId。

 

_id

    实际开发中,MongoDB 中存储的文档的 _id,这个键的值可以是任何类型。每个文档都有唯一的"_id" 值,来确保集合里面每个文档都能被唯一标识。   如果插入文档的时候没有"_id" 键,系统会自动帮创建一个,且默认是个ObjectId 对象。

 

    虽然ObjectId 设计成轻量型的,易于生成,但是毕竟生成的时候还是产生开销。在客户端生成体现了MongoDB 的设计理念:能从服务器端转移到驱动程序来做的事,就尽量转移。这种理念背后的原因是,即便是像MongoDB 这样的可扩展数据库,扩展应用层也要比扩展数据库层容易得多。将事务交由客户端来处理,就减轻了数据库扩展的负担。

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

本文转载自:http://book.51cto.com/art/201112/307016.htm

共有 人打赏支持
ND小龙
粉丝 10
博文 45
码字总数 2295
作品 0
福州
私信 提问
MongoDB学习笔记-- 插入、查找(三)

创建一个集合并向该集合中添加文档 当我们向某集合中插入文档时,如果该集合不存在,mongodb会自动创建该集合,不需手动创建集合,同时也不需要指定文档的结构。 创建并插入文档 j = {name:...

无名99268
2013/10/15
0
0
初识MongoDB-用法和用途

用意:记录一下自己学习MongoDB的一些体会. 适合范围, 安装和用法. 一. MongoDB相关 JavaScript统一天下 JavaScript正在快节奏地统一整个web开发流程. JvaScript是WEB前端开发的唯一依靠, 依赖...

清风漫步
2014/02/21
0
0
The little mongoDB book测试数据及笔记

./mongod ./mongo show dbs 或show databases use learn show collections 或show tables P5 db.system.indexes.find() db.unicorns.insert({name: 'Leto', gender: 'm', home: 'Arrakeen', ......

cyper
2014/05/19
0
1
基于Mongodb分布式存储物理文件

在之前的文章中介绍了如何对关系型数据数据通过auto-sharding进行分布式数据存储,今天介绍如何对物理文件(小文件,基本小于100K)进行分布式存储。 接着看一下要配置的测试环境(与前一篇中...

长平狐
2012/11/06
119
0
Ubuntu安装MongoDB以及CRUD

看这里:http://my.oschina.net/sunhaojava/blog/208408 以下是从MongoDB in Action摘录的. http://www.mongodb.org/downloads 找到最新版本的下载路径 使用工具或curl下载(绿色,解压即可使...

cyper
2014/05/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

十月开源项目推荐:专为 Python 初学者准备的 IDE 你用过吗?

每月新增开源项目。顾名思义,每月更新一期。我们会从社区上个月新收录的开源项目中,挑选出有价值的、有用的、优秀的、或者好玩的开源项目来和大家分享。数量不多,但我们力求推荐的都是精品...

编辑部的故事
16分钟前
6
0
Java/Android 获取文件夹的文件列表(file.listFiles())并按名称排序,中文优先

排序规则 因为是中国人,习惯性看中文文件夹放前面比较顺眼,所以在别人博客(https://blog.csdn.net/da_caoyuan/article/details/56664673)的基础上,加上了自己的排序规则。 默认排序规则...

她叫我小渝
16分钟前
0
0
RabbitMQ通过shovel插件迁移数据

前言 生产环境中会遇到RabbitMQ数据迁移的场景,例如:切换云服务厂商、不同Region之间数据迁移、新搭建RabbitMQ实例,数据需要同步至新的RabbitMQ实例。 前提条件: 源RabbitMQ实例打开了s...

中间件小哥
19分钟前
0
0
kubernetes 环境搭建

kubernetes 简介:Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful)。 点击此处查看官网详情。...

MrPei
34分钟前
1
0
关于scala macro的example

http://www.bbartosz.com/blog/2016/09/24/fun-with-scalameta-examples-part1/

Littlebox
36分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部