文档章节

Mongo之ObjectId原理(学习笔记)

ND小龙
 ND小龙
发布于 2017/08/14 00:40
字数 703
阅读 23
收藏 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
143
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

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
9
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
3
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
5
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部