ObjectId是一个24位的字符串,实际是由一组十六进制的字符构成,共12个字节。(1个字节8位能表示2个十六进制数,12个字节能表示24个十六进制数)。

ObjectId 是一个12字节 BSON 类型数据,有以下格式:

  • 前4个字节表示时间戳(精确到秒的时间戳)
  • 接下来的3个字节是机器标识码
  • 紧接的两个字节由进程id组成(PID)
  • 最后三个字节是随机数。

我们的SpringBoot、SpringMVC程序往Mongodb插入一个文件时,这个ObjectId不是Mongodb生成的,而是由我们的应用程序生成的保存到Mongodb数据库。

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

spring-boot-starter-data-mongodb实现了ObjectId类,里面实现了ObjectId的生成。

首先看一下ObjectId有一个静态代码块

0x01000000 ---> 0000 0001 0000 0000 0000 0000 0000 0000 ---> 2^24

0x00008000 ---> 0000 0000 0000 0000 1000 0000 0000 0000 ---> 2^15

RANDOM_VALUE1代表了3个字节的机器标识符

RANDOM_VALUE2代表了2个字节的进程id(两个字节的最大值为2^16,但是操作系统的pid范围的最大值默认是2^15,所以随机生成数最大值的范围到2^15就够了)

ObjectId类里还有一个重要的变量,NEXT_COUNTER,它是一个静态线程安全的Integer(在同一个java进程中,在一秒内,多个线程同时生成ObjectId,最后每个ObjectId的最后三个字节一定是不一样的),最后三个字节的随机数将由它来生成,初始值是随机的,每使用一次就自增1,使用的时候会跟0x00ffffff相与,保证数值在三个字节以内。

private static final AtomicInteger NEXT_COUNTER = new AtomicInteger(new SecureRandom().nextInt());

Mongodb ObjectId格式相关推荐

  1. mongodb objectid java_我可以确定字符串是否是MongoDB ObjectID吗?

    回答(10) 2 years ago 我发现mongoose ObjectId验证器用于验证有效的objectIds,但我发现了一些无效ID被认为有效的情况 . (例如:任何12个字符长的字符串) v ...

  2. mongodb 时间格式的转换

    mongodb内置的时间类是ISODate,当我们使用springdatamongo的时候,Spring 会将java.util.Date一直对应 而要想在数据库中对时间格式做相互转换的话,要注意时以 ...

  3. mysql_时间段维度统计,关于MongoDB时间格式转换和时间段聚合统计的用法总结

    一 . 背景需求 在日常的业务需求中,我们往往会根据时间段来统计数据.例如,统计每小时的下单量:每天的库存变化,这类信息数据对运营管理很重要. 这类数据统计依赖于各个时间维度,年月日.时分秒都有可能. ...

  4. java objectid_关于MongoDB ObjectId

    ObjectId的构成 ObjectId的值由12个字节组成,其中, 4个字节表示时间戳(自Unix纪元以来的秒数),记录创建时间: 3个字节表示机器标识符,保证不同主机产生不同的ObjectId值: ...

  5. java objectid_如何在java中创建mongoDB objectid

    参考 How to add an array to a MongoDB document using Java?后 我用java创建了一个mongo模式 它有子元素,我得到主文件的_id 我想在子元素 ...

  6. Python Cerberus

    cerberus地狱犬 (Cerberus是一个用于Python的轻量级且可扩展的数据验证库) 前言 文章内容有点多,是自己学习cerberus的记录,原文,由于篇幅有限,源码的解析就没有了,源码不是 ...

  7. MongoDB SpringBoot ObjectId序列化json为String

    mongodb的ObjectId默认序列化为bean对象,如果需要转换为json字符对象,配置如下 @Configuration public class JacksonConfig implemen ...

  8. mongodb 字符串转bson_BSON及mongoDB数据类型

    JSON是一种被广泛使用的轻量级的数据交换格式,支持现今绝大多数主流的开发语言.而近几年崛起的mongDB则采用了类JSON的数据格式,在JSON之上进行了丰富和增强,使得mongoDB可以处理及报错 ...

  9. 【MongoDB】5.MongoDB与java的简单结合

    1.首先 你的清楚你的MongoDB的版本是多少  就下载对应的架包 下载地址如下: http://mongodb.github.io/mongo-java-driver/ 2.新建一个项目  把架包 ...

最新文章

  1. 2018 俄罗斯世界杯赛程时间表
  2. neo4j安装_Neo4J和Enterprise Java的撤消功能
  3. DAY4-打卡第四天-2018-1-12
  4. c++builder传递参数_参数按值传递和按地址传递过程中,指向内存的指针如何变化?...
  5. pojo类不能有默认值怎么办_打印机不能打印是什么原因 打印机不能打印处理方法介绍【详解】...
  6. 【CodeVS】1993草地排水
  7. 读写锁分离的循环队列
  8. 网络的小区号和网络tac_网络问政|城基路老旧小区排污管长期堵塞没人管?
  9. 学了python的感悟_初学python之感悟
  10. java经典实例 源代码_100个Java经典编程实例源代码JAVA源码下载
  11. 软件测试中期答辩,中期答辩材料创新张颖
  12. 通过网页端保存ins图片的方法(谷歌浏览器)
  13. 人工智能专业好就业吗?AI就业前景
  14. 对策论基础---矩阵对策的解法
  15. 部门来了个测试工程师,一副小毛孩样,本以为很菜,谁想到...
  16. Tarena - 分组查询
  17. I9 9900K线程_彗星降落人间——Intel第十代台式机酷睿处理器评测之I9篇
  18. 计算机教案三维目标,教学设计的三维目标
  19. 福大软工 · 最终作业 - 软件工程实践总结(个人)
  20. Linux下如何颁发证书:学习使用openssl搭建一个CA

热门文章

  1. 做父母“不吼不叫”的六种方法
  2. 网游已成文化产业支柱:年入600亿为电影4.5倍
  3. openpnp - camera - FPS掉帧的解决思路
  4. 联想小新Pro16和小新air15 的区别 哪个更值得入手
  5. 如何把map转成json字符串
  6. 设计模式 - Reactor 模式
  7. 调试经验——Ryzen vs i7(AMD锐龙处理器与Intel i7处理器性能对比)
  8. Orleans 2.0 官方文档 ——Grains定时器和提醒器(Reminder)
  9. InfluxDB删除数据
  10. 贫瘠之地手游一直显示连接服务器,《炉石传说》贫瘠之地的锤炼进入异常解决攻略 进不去如何解决...