当前位置: 首页 > 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()
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 07.Android之多媒体问题
  • js 实现textarea输入字数提示
  • LeetCode29.两数相除 JavaScript
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 机器学习中为什么要做归一化normalization
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 浅谈web中前端模板引擎的使用
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 使用 QuickBI 搭建酷炫可视化分析
  • 再谈express与koa的对比
  • 自动记录MySQL慢查询快照脚本
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • #《AI中文版》V3 第 1 章 概述
  • (16)Reactor的测试——响应式Spring的道法术器
  • (4)STL算法之比较
  • (arch)linux 转换文件编码格式
  • (办公)springboot配置aop处理请求.
  • (笔试题)合法字符串
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)ssm高校实验室 毕业设计 800008
  • .describe() python_Python-Win32com-Excel
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET Core 2.1路线图
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET 命令行参数包含应用程序路径吗?
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @Transient注解
  • [20161101]rman备份与数据文件变化7.txt
  • [20180129]bash显示path环境变量.txt
  • [Android Studio 权威教程]断点调试和高级调试
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配
  • [C#]C# OpenVINO部署yolov8图像分类模型
  • [C++]类和对象(中)
  • [FFmpeg学习]从视频中获取图片
  • [Git 1]基本操作与协同开发