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这个类型也很好的支持了全局的唯一性.
目录
相关文章
|
存储 NoSQL Unix
.NET生成MongoDB中的主键ObjectId
.NET生成MongoDB中的主键ObjectId
172 5
.NET生成MongoDB中的主键ObjectId
|
SQL 存储 NoSQL
MongoDB:21-MongoDB-自增Id
MongoDB:21-MongoDB-自增Id
MongoDB:21-MongoDB-自增Id
|
6月前
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——根据上级ID查询文章评论的分页列表
本节介绍如何根据上级ID查询文章评论的分页列表,主要包括以下内容:(1)在CommentRepository中新增`findByParentid`方法,用于按父ID查询子评论分页列表;(2)在CommentService中新增`findCommentListPageByParentid`方法,封装分页逻辑;(3)提供JUnit测试用例,验证功能正确性;(4)使用Compass插入测试数据并执行测试,展示查询结果。通过这些步骤,实现对评论的高效分页查询。
83 0
|
NoSQL 数据挖掘 MongoDB
深入了解MongoDB:利用$type操作符轻松操控数据类型
深入了解MongoDB:利用$type操作符轻松操控数据类型
131 0
|
10月前
|
存储 NoSQL MongoDB
MongoDB ObjectId
10月更文挑战第22天
144 2
|
11月前
|
NoSQL Java MongoDB
MongoDB $type 操作符
10月更文挑战第16天
100 2
|
NoSQL MongoDB 数据库
深入探究MongoDB的ObjectId:唯一性、顺序性与应用指南
深入探究MongoDB的ObjectId:唯一性、顺序性与应用指南
870 0
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
292 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转换

推荐镜像

更多