当前位置: 首页 > news >正文

MongoDB【应用 01】通过_id获取记录创建时间(生成规则+解析步骤+源码分享)

通过_id获取记录创建时间

  • 1. _id的生成规则
  • 2. 步骤及举例
    • 2.1 步骤
    • 2.2 举例

1. _id的生成规则

MongoDB 的 _id 值按照 ObjectId 的生成规则来生成。ObjectId是一个12字节(16进制表示为 24 位字符串)的标识符,它的构成包括以下几个部分:

  • 【4字节】时间戳(Timestamp):前 4 个字节表示创建此 ObjectId 时的 Unix 时间戳(精确到秒)。这提供了秒级的时间唯一性。
  • 【3字节】机器标识符(Machine Identifier):接下来的 3 个字节代表生成此 ObjectId 的机器的唯一标识符。通常,这基于主机名的散列值,确保在同一网络中的不同服务器上生成的 ObjectId 可以区分。
  • 【2字节】进程标识符(Process Identifier, PID):接下来的 2 个字节表示生成此 ObjectId 的进程 ID。这样即使在同一台机器上运行的多个 MongoDB 实例或进程,也能确保它们生成的 ObjectId 是唯一的。
  • 【3字节】计数器(Counter):最后的 3 个字节包含一个计数器,它在一个特定的秒内(即具有相同时间戳的部分)递增。这个计数器在每个新生成的 ObjectId 中增加,确保即使在同一秒内,在同一台机器上的同一个进程中创建的多个 ObjectId 也是唯一的。

2. 步骤及举例

2.1 步骤

通过_id获取到创建时间的步骤为:

  1. 查询文档: 首先,查询目标文档的_id字段值。
  2. 提取前8位十六进制字符: 从ObjectId对象中提取前8位(4个十六进制字符)。
  3. 转换为十进制数: 使用适当的函数或方法将这4个十六进制字符转换为10进制数。
  4. 格式化成时间:使用函数将毫秒值转换为时间格式。

2.2 举例

以下是一条记录,_id是数据库生成的,createTime是后天的当前时间:

_idcreateTime
66160a7c519bf4573a3bd5a62024-04-08 11:41:48

以下为Java代码:

public static void main(String[] args) {// 1. 目标_id字段值String _id = "66160a7c519bf4573a3bd5a6";// 2. 提取前8位十六进制字符String timestampStr = _id.substring(0, 8);// 3. 转换为10进制数long timestampInSeconds = Long.parseLong(timestampStr, 16);// 4. 格式化成时间// 将时间戳转换为毫秒long timestampInMillis = timestampInSeconds * 1000;// 使用时间戳创建一个Instant对象Instant instant = Instant.ofEpochMilli(timestampInMillis);// 创建DateTimeFormatter对象并设置格式模式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 将Instant对象转换为LocalDateTime,并在指定时区下格式化为字符串String formattedDateTime = instant.atZone(ZoneId.systemDefault()).format(formatter);// 输出结果System.out.println("Formatted date and time: " + formattedDateTime);
}

执行结果:

Formatted date and time: 2024-04-10 11:41:48

相关文章:

  • 计算机组成原理(存储器)
  • 全量知识系统 程序详细设计 之 先验逻辑-实现:从“平凡”回到“平凡” (QA 百度搜索)
  • Echarts-实现地图并轮播地图信息
  • WebView的使用与后退键处理
  • CRMEB多商户商城系统,不止B2B2C
  • 【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(八)- 向量整数算术指令
  • 【c++】string类常见接口函数
  • SpringMVC项目入门
  • python 读取文件内容每一行,写入另一个文件内
  • 微服务-7 Docker
  • 【Java基础题型】遍历1000以内的完数
  • 未来驾驶的革命:自动驾驶技术与智能交通系统的崛起
  • centos安装使用elasticsearch
  • python统计分析——一般线性回归模型
  • 从零开始的LeetCode刷题日记:28. 实现 strStr()
  • [译] 怎样写一个基础的编译器
  • Cumulo 的 ClojureScript 模块已经成型
  • Iterator 和 for...of 循环
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • magento2项目上线注意事项
  • Python socket服务器端、客户端传送信息
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • ReactNativeweexDeviceOne对比
  • storm drpc实例
  • Vue 2.3、2.4 知识点小结
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 手写双向链表LinkedList的几个常用功能
  • 通过git安装npm私有模块
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​iOS实时查看App运行日志
  • ​如何在iOS手机上查看应用日志
  • #laravel 通过手动安装依赖PHPExcel#
  • #pragma 指令
  • (30)数组元素和与数字和的绝对差
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (编译到47%失败)to be deleted
  • (二)linux使用docker容器运行mysql
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (力扣题库)跳跃游戏II(c++)
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (五)c52学习之旅-静态数码管
  • (转)LINQ之路
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net framework4与其client profile版本的区别
  • .Net Winform开发笔记(一)
  • .NET 分布式技术比较
  • .net连接oracle数据库
  • @Autowired多个相同类型bean装配问题
  • @EnableAsync和@Async开始异步任务支持
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • []串口通信 零星笔记
  • [20180129]bash显示path环境变量.txt