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
获取到创建时间的步骤为:
- 查询文档: 首先,查询目标文档的_id字段值。
- 提取前8位十六进制字符: 从ObjectId对象中提取前8位(4个十六进制字符)。
- 转换为十进制数: 使用适当的函数或方法将这4个十六进制字符转换为10进制数。
- 格式化成时间:使用函数将毫秒值转换为时间格式。
2.2 举例
以下是一条记录,_id是数据库生成的,createTime是后天的当前时间:
_id | createTime |
---|---|
66160a7c519bf4573a3bd5a6 | 2024-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