MongoDB's _id key and ObjectId type

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

_id key举例说明 : 
当我们在往一个collection中写入一条记录时,系统会自动生成一个名为_id 的key.如:
> db.userinfo.insert({"username":"digoal","age":27})  
> db.userinfo.findOne()
{
        "_id" : ObjectId("4d1952479581fcf2f449f55e"),
        "username" : "digoal",
        "age" : 27
}
这里多出了一个类型为ObjectId的key ,在插入时并没有指定对吧,有点类似ORACLE的ROWID的信息。

在mongoDB中,每一个collection都必须有一个叫做_id的字段,字段类型默认是ObjectId ,换句话说,字段类型可以不是ObjectId,例如:
> db.userinfo.insert({"_id":1,"username":"digoal","age":27})
> db.userinfo.find()                                        
{ "_id" : ObjectId("4d1952479581fcf2f449f55e"), "username" : "digoal", "age" : 27 }
{ "_id" : 1, "username" : "digoal", "age" : 27 }
虽然_id的类型可以自由指定,但是在同一个collection中必须唯一。如下:
> db.userinfo.insert({"_id":1,"username":"digoal","age":27})
E11000 duplicate key error index: test.userinfo.$_id_  dup key: { : 1.0 }
因为前面已经插入了一条_id=1的记录,所以再插就不允许了 。

ObjectId 类型举例说明 : 
ObjectId是_id的默认类型前面已经提到过,下面我们来看看几个要素:
1. _id在一个collection中必须是唯一的,
2. 一般的程序设计理念是将运算推送到客户端,而不是服务端或数据库,
要满足第一点的话,ObjectId的产生必须是唯一的,ObjectId由12个字节组成,我们来看看ObjectId的结构:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 
0-3表示timestamp
4-6表示machine
7-8表示PID
9-11表示increment
下面来详细的解释一下:
timestamp分片 : 表述自 1970 -01-01T00:00:00Z以来的经过秒数.由于将timestamp放在整个KEY的前面四个字节,所以插入顺序和_id的顺序基本匹配,使用timestamp还有一个好处是,某些客户端驱动可以通过ObjectId解析出该记录是何时插入的。
machine分片 : 表述产生这个ObjectId的主机的主机名(通常是主机名)的hash值,因此不同的主机将产生不同的HASH值。
PID分片 : 表述产生这个ObjectId的进程的进程号,因此在同一个主机中不同的进程产生的ObjectId值也是不一样的。
前面9个字节的值确保了在同一秒不同的主机不同的进程产生的ObjectId是唯一的。
increment分片 : 为了确保同一台主机同一个进程在同一秒内产生的ObjectId唯一,最后三个字节是一个自增长的值,允许256的3次方等于16777216条记录的唯一性。

虽然mongodb的sharding很好很强大,但是产生ObjectId也会有一定的服务器资源开销,所以遵循一般的程序设计理念,将运算推送到客户端,而不是在服务端或数据库。
因此大多数mongodb的客户端驱动都支持ObjectId的生成,而ObjectId这个类型也很好的支持了全局的唯一性.
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
3月前
|
存储 NoSQL Unix
.NET生成MongoDB中的主键ObjectId
.NET生成MongoDB中的主键ObjectId
.NET生成MongoDB中的主键ObjectId
|
SQL 存储 NoSQL
MongoDB:21-MongoDB-自增Id
MongoDB:21-MongoDB-自增Id
651 0
MongoDB:21-MongoDB-自增Id
|
2月前
|
NoSQL 数据挖掘 MongoDB
深入了解MongoDB:利用$type操作符轻松操控数据类型
深入了解MongoDB:利用$type操作符轻松操控数据类型
|
NoSQL Java MongoDB
Java对MongoDB的ObjectId的序列化问题
MongoDB在不特殊指认的情况下,默认的集合主键是“_id”,类型是ObjectId。ObjectId是一个12字节的BSON类型字符串,包含了UNIX时间戳,机器识别码,进程号,计数值信息。
4492 0
|
NoSQL 索引 MongoDB
MongoDB ObjectId详解及使用
MongoDB中我们经常会接触到一个自动生成的字段:”_id”,类型为ObjectId。 本文详解ObjectId的构成和使用。 ObjectId构成 之前我们使用MySQL等关系型数据库时,主键都是设置成自增的。
1197 0
|
2月前
|
NoSQL MongoDB 数据库
深入探究MongoDB的ObjectId:唯一性、顺序性与应用指南
深入探究MongoDB的ObjectId:唯一性、顺序性与应用指南
|
3月前
Due to limitations of the com.mongodb.BasicDocument, you can‘t add a second ‘_id‘ criteria. Query al
Due to limitations of the com.mongodb.BasicDocument, you can‘t add a second ‘_id‘ criteria. Query al
102 2
|
NoSQL MongoDB 数据库
分布式服务器框架之Server.Core库中实现YFUniqueEntity、YFUniqueIDBase 管理MongoDB 自定义Id的自增
YFUniqueEntity是数据库中的结构,GetUniqueID函数中会根据Type和自增步长去数据库中寻找该类型的当前ID是多少,然后会用当前的Id去加上步长,把更新后的新ID插入到MongoDB中记录着ID的那张表里。
|
JSON NoSQL MongoDB
分布式服务器框架之Servers.Core库中实现MongoDB的ObjectId和Json转换
分布式服务器框架之Servers.Core库中实现MongoDB的ObjectId和Json转换

热门文章

最新文章