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
目录
打赏
0
0
0
0
20692
分享
相关文章
.NET生成MongoDB中的主键ObjectId
.NET生成MongoDB中的主键ObjectId
134 5
.NET生成MongoDB中的主键ObjectId
MongoDB:21-MongoDB-自增Id
MongoDB:21-MongoDB-自增Id
743 0
MongoDB:21-MongoDB-自增Id
微服务——MongoDB实战演练——根据上级ID查询文章评论的分页列表
本节介绍如何根据上级ID查询文章评论的分页列表,主要包括以下内容:(1)在CommentRepository中新增`findByParentid`方法,用于按父ID查询子评论分页列表;(2)在CommentService中新增`findCommentListPageByParentid`方法,封装分页逻辑;(3)提供JUnit测试用例,验证功能正确性;(4)使用Compass插入测试数据并执行测试,展示查询结果。通过这些步骤,实现对评论的高效分页查询。
27 0
MongoDB ObjectId
10月更文挑战第22天
58 2
深入了解MongoDB:利用$type操作符轻松操控数据类型
深入了解MongoDB:利用$type操作符轻松操控数据类型
MongoDB $type 操作符
10月更文挑战第16天
56 2
深入探究MongoDB的ObjectId:唯一性、顺序性与应用指南
深入探究MongoDB的ObjectId:唯一性、顺序性与应用指南
566 0
|
11月前
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
219 2
分布式服务器框架之Server.Core库中实现YFUniqueEntity、YFUniqueIDBase 管理MongoDB 自定义Id的自增
YFUniqueEntity是数据库中的结构,GetUniqueID函数中会根据Type和自增步长去数据库中寻找该类型的当前ID是多少,然后会用当前的Id去加上步长,把更新后的新ID插入到MongoDB中记录着ID的那张表里。
分布式服务器框架之Servers.Core库中实现MongoDB的ObjectId和Json转换
分布式服务器框架之Servers.Core库中实现MongoDB的ObjectId和Json转换