[MongoDB]MongoDB的ObjectId组成
一、ObjectId的组成
首先通过终端命令行,向mongodb的collection中插入一条不带“_id”的记录。然后,通过查询刚插入的数据,发现自动生成了一个objectId
“5e4fa350b636f733a15d6f62”这个24位的字符串,虽然看起来很长,也很难理解,但实际上它是由一组十六进制的字符构成,每个字节两位的十六进制数字,总共用了12字节的存储空间。相比MYSQL int类型的4个字节,MongoDB确实多出了很多字节。不过按照现在的存储设备,多出来的字节应该不会成为什么瓶颈。不过MongoDB的这种设计,体现着空间换时间的思想。
 ObjectId的官方规范
1)Time
时间戳。将刚才生成的objectid的前4位进行提取“5e4fa350”,然后按照十六进制转为十进制,变为“1582277456”,这个数字就是一个时间戳。通过时间戳的转换,就成了易看清的时间格式2020-02-21 17:30:56,
2)Machine
机器。接下来的三个十六进制就是“b636f7”,这三个是所在主机的唯一标识符,一般是机器主机名的散列值,这样就确保了不同主机生成不同的机器hash值,确保在分布式中不造成冲突,这也就是在同一台机器生成的objectId中间的字符串都是一模一样的原因。
3)PID
进程ID。上面的Machine是为了确保在不同机器产生的objectId不冲突,而pid就是为了在同一台机器不同的mongodb进程产生了objectId不冲突,接下来的“af71”两位就是产生objectId的进程标识符。
4)INC
自增计数器。前面的九个字节是保证了一秒内不同机器不同进程生成objectId不冲突,这后面的三个字节“5d6f62”是一个自动增加的计数器,用来确保在同一秒内产生的objectId也不会发现冲突,允许256的3次方等于16777216条记录的唯一性。
总的来看,objectId的前4个十六进制字符是时间戳,记录了文档创建的时间;接下来3个十六进制字符代表了所在主机的唯一标识符,确定了不同主机间产生不同的objectId;后2个是进程id,决定了在同一台机器下,不同mongodb进程产生不同的objectId;最后通过3个是自增计数器,确保同一秒内产生objectId的唯一性。ObjectId的这个主键生成策略,很好地解决了在分布式环境下高并发情况主键唯一性问题,值得学习借鉴
php插入mongodb获取id和列取id的方法
<?php
$params=[
'user'=> 'shihan', ];
$mongoManger = new MongoDB\Driver\Manager("mongodb://127.0.0.1:27017");
$collect='test.myusers';
$bulk = new MongoDB\Driver\BulkWrite();
$id=$bulk->insert($params);
$writeResult=$mongoManger->executeBulkWrite($collect, $bulk);
var_dump($id); $filter=[];
$options = [];
$collect='test.myusers';
$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $mongoManger->executeQuery($collect, $query);
if($cursor->isDead()){
}
$list=[];
foreach ($cursor as $document) {
var_dump($document->_id->__toString());
}
[MongoDB]MongoDB的ObjectId组成的更多相关文章
- MongoDB中_id(ObjectId)生成
		MongoDB 中我们经常会接触到一个自动生成的字段:"_id",类型为ObjectId. 之前我们使用MySQL等关系型数据库时,主键都是设置成自增的.但在分布式环境下,这种方法 ... 
- ThinkPhp5 mongodb 使用自定义objectID出错解决
		在Tp5中使用mongodb 使用自定义ObjectId时报错:Cannot use object of type MongoDB\\BSON\\ObjectID as array 查询源码发现在to ... 
- [MongoDB]MongoDB与JAVA结合使用CRUD
		汇总: 1. [MongoDB]安装MongoDB2. [MongoDB]Mongo基本使用:3. [MongoDB]MongoDB的优缺点及与关系型数据库的比较4. [MongoDB]MongoDB ... 
- [MongoDB]MongoDB的优缺点及与关系型数据库的比较
		汇总: 1. [MongoDB]安装MongoDB2. [MongoDB]Mongo基本使用:3. [MongoDB]MongoDB的优缺点及与关系型数据库的比较4. [MongoDB]MongoDB ... 
- Getting Started with MongoDB (MongoDB Shell Edition)
		https://docs.mongodb.com/getting-started/shell/ Overview Welcome to the Getting Started with MongoDB ... 
- MongoDB学习笔记~ObjectId主键的设计
		回到目录 说一些关于ObjectId的事 MongoDB确实是最像关系型数据库的NoSQL,这在它主键设计上可以体现的出来,它并没有采用自动增长主键,因为在分布式服务器之间做数据同步很麻烦,而是采用了 ... 
- java 查询 mongodb 中的objectid
		网上找了很久查询objectid的方法都是错的,用mongovue能查询出来,但就是用java不知道怎么查询 1.mongovue里的查询方式: {"_id" : ObjectId ... 
- 生成类似于MongoDB产生的ObjectId
		package com.jt.boot.utils; import com.google.common.base.Objects; import java.net.NetworkInterface; ... 
- MongoDB - Introduction to MongoDB, MongoDB Extended JSON
		JSON can only represent a subset of the types supported by BSON. To preserve type information, Mongo ... 
随机推荐
- 微信小程序 npm 找不到npm包 没有找到可以构建的npm包 如何使用第三方npm组件
			微信官方的npm文档 太模糊了,而且感觉把最重要的东西写在了最后面,我这里费了老大功夫才知道这个坑. 初次使用,首先要初始化 npm 初始化——> 找到 pages 这个文件夹,然后进入这个文件 ... 
- 物流跟踪API-快递单订阅
			上一篇文章我们讲解了轨迹查询的接口,通过快递鸟接口可以实现实时查询物流轨迹,这次给大家推荐订阅服务功能. 为了更好的理解订阅服务,我们来做个对比, 即时查询是主动查询物流轨迹,需要我们主动调用接口才能 ... 
- The import java.io cannot be resolved (类库无法解析的问题解决 )
			导入一个新项目后常会出现 The import java.io cannot be resolved String cannot be resolved to a type 其原因在于没有导入需要的包 ... 
- 在cmd中启动tomcat
			E:\Documents and Settings\topicis>h: H:\>cd tomcat-test H:\tomcat-test>cd bin H:\tomcat-tes ... 
- C++零食:WTL中使用双缓冲避免闪烁
			双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板.首先我们在内存环境中建立一个"虚拟"的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制 ... 
- 懒人必备,IntelliJ IDEA中代码一键生成
			之前有不少小伙伴问松哥微人事项目(https://github.com/lenve/vhr)使用的 MyBatis 逆向工程在哪里?其实旧版微人事当时没有使用逆向工程,是我自己手动敲出来的,当然手动敲 ... 
- 51nod 1133 不重叠的线段 (贪心,序列上的区间问题)
			题意: 最多能选几条不重叠的线段 思路: 按R从小到大排序,维护一个最大的右端点 右端点最小的那个线段是必选的,可以贪心地证明 代码: #include<iostream> #includ ... 
- Mysql:自动化备份
			简介 在这个数据为王的时代,数据的备份十分重要,这里就分享一篇mysql数据库自动备份的脚本(是从网上搜到的),其将配置文件和备份脚本分离,提高了安全性,脚本风格规范严谨,分享给大家希望对需要的小伙伴 ... 
- JDBCTemplate初学简介
			JDBCTemplate JdbcTemplate是Spring的一部分,是对数据库的操作在jdbc的封装,处理了资源的建立和释放(不需要我们管理连接了),我们只需要提供SQL语句(不需要我们设置参数 ... 
- HTTP&HTTPS协议详解之HTTP篇
			一.HTTP简介 01.什么是HTTP HTTP(HyperText Transfer Protocol ,超文本传输协议),是一个基于请求与响应的,无状态的,应用层的协议,常基于TCP/IP协议传输 ... 
