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

通过_id获取记录创建时间

  • [1. _id的生成规则](#1. _id的生成规则)
  • [2. 步骤及举例](#2. 步骤及举例)
    • [2.1 步骤](#2.1 步骤)
    • [2.2 举例](#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是后天的当前时间:

_id createTime
66160a7c519bf4573a3bd5a6 2024-04-08 11:41:48

以下为Java代码:

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);
}

执行结果:

bash 复制代码
Formatted date and time: 2024-04-10 11:41:48
相关推荐
TH_12 分钟前
6、前台界面传递老数据,导致业务数据错误
数据库
光影少年27 分钟前
PostgreSQL数据库学习路线
数据库·学习·postgresql
哈哈老师啊34 分钟前
Springboot简单二手车网站qs5ed(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
JIngJaneIL39 分钟前
基于Java+ vue图书管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
VX:Fegn08951 小时前
计算机毕业设计|基于springboot + vue考勤管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
晚风_END1 小时前
postgresql数据库|数据库维护系列|postgresql数据库参数配置详解和数据库维护时机的选择(三)
运维·开发语言·数据库·postgresql·oracle
一 乐1 小时前
幼儿园管理|基于springboot + vue幼儿园管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
JIngJaneIL1 小时前
基于Java + vue校园论坛系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
期待のcode1 小时前
Springboot多数据源配置
java·数据库·spring boot·后端·mybatis
JH灰色1 小时前
【大模型】-LangChain自定义工具调用
数据库·langchain