MongoDB-ObjectID 生成器

前言
MongoDB中一个非常关键的概念就是 ObjectID,它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能,还能帮助更好地理解 MongoDB 的设计理念。
什么是 MongoDB ObjectID?
在 MongoDB 中,每个文档都有一个 _id 字段作为主键。如果你没有显式指定 _id 字段的值,MongoDB 会自动生成一个值,这个值就是 ObjectID。
ObjectID 是一个 12 字节(96 位)的 BSON 类型,它有着非常严格的生成规则和格式。每个 ObjectID 都是唯一的,且按照特定规则生成,可以保证在大多数情况下不会重复。其结构为:
- 4 字节:时间戳(自 Unix 纪元以来的秒数)。这使得 ObjectID 包含了文档生成的时间信息。
- 5 字节:机器标识符,用来标识生成 ID 的主机(例如通过机器的 MAC 地址获取)。
- 2 字节:进程 ID,用来标识生成 ID 的进程。
- 3 字节:计数器。该计数器在每个进程中为每个生成的 ObjectID 提供唯一性。每次生成 ObjectID 时,这个计数器会递增。
ObjectID 的结构示意
| 字节位置 | 1-4 | 5-9 | 10-11 | 12-14 |
|---|---|---|---|---|
| 描述 | 时间戳 | 机器标识符 | 进程标识符 | 自增计数器 |
| 字节数 | 4 字节 | 5 字节 | 2 字节 | 3 字节 |
每个部分的设计都有其特定的目的,确保生成的 ObjectID 既是唯一的,又能提供文档的时间信息。
ObjectID 生成的特点
1、时间信息嵌入:
ObjectID 包含了文档创建的时间戳,这意味着每个 ObjectID 都能提供文档生成的精确时间。通过对 ObjectID 进行解析,你可以得到该文档被创建的大致时间(精确到秒)。
2、高效性:
由于 ObjectID 是通过多种因素(时间戳、机器 ID、进程 ID 和计数器)来生成的,因此 MongoDB 可以在不依赖中心化服务的情况下,保证全球范围内每个 ObjectID 的唯一性。
3、不依赖外部系统:
相比其他数据库需要引入序列号或 GUID 等外部生成器,MongoDB 的 ObjectID 生成是完全自给自足的,依赖的是机器、进程和时间等信息,避免了性能瓶颈。
4、升序排序特性:
ObjectID 的前 4 个字节是时间戳,因此它们在生成时会随着时间的推移递增。这意味着按 _id 字段排序时,文档会按时间顺序排列,尤其是在没有显式索引的情况下,这对于查询时的性能优化有一定好处。
MongoDB ObjectID 的优缺点
优点
1、唯一性保证:ObjectID 的设计使其具有全球唯一性,确保在分布式环境中不会发生冲突。
2、内建时间戳:内嵌时间戳能直接提供文档创建的时间,对于需要按时间顺序进行排序或查询的场景尤其有用。
3、无需依赖外部系统:不需要使用外部的 UUID 或序列生成器,降低了系统复杂度和外部依赖。
缺点
1、长字符串:ObjectID 是一个 12 字节的二进制值,通常会转成 24 字符的十六进制字符串,在某些情况下,这可能比传统的 4 字节整数 ID 占用更多存储空间。
2、不易读:虽然 ObjectID 中包含时间戳,但它本身并不直观,不能直接作为一个有意义的业务标识符使用。如果你希望使用更易读的 ID,可以考虑自定义 ID 生成策略。
自定义 ObjectID
尽管 MongoDB 默认使用 ObjectID 作为主键,你依然可以根据自己的需求自定义 _id 字段。比如,在某些情况下,你可能希望使用更简短或更具业务意义的 ID,例如 UUID 或者业务自定义的编码。
const { v4: uuidv4 } = require('uuid');
const newDocument = {_id: uuidv4(), // 使用 UUID 作为自定义的 IDname: "example"
};
如何通过 MongoDB 获取 ObjectID 的时间戳
MongoDB 提供了方便的方法,可以从 ObjectID 中提取出创建文档的时间戳。例如,在 MongoDB shell 中,您可以通过以下方式获取 ObjectID 的时间戳:
const objectId = ObjectId("5f8d0d55b54764421b7156c5");
const timestamp = objectId.getTimestamp();
print(timestamp);
输出将是该 ObjectID 对应文档的创建时间。这个特性非常适合进行时间排序和时间范围查询。
总结
MongoDB 的 ObjectID 是一个非常高效且实用的唯一标识符,它通过结合时间戳、机器标识符、进程 ID 和自增计数器的方式,确保每个生成的 ID 都是唯一的,同时提供了内嵌的时间信息。对于大多数应用场景,MongoDB 默认的 ObjectID 生成策略足以应对需求。但在某些特殊需求下,你也可以根据业务需求自定义 _id 字段的生成方式。

相关文章:
MongoDB-ObjectID 生成器
前言 MongoDB中一个非常关键的概念就是 ObjectID,它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能,还能帮助更好地理解 MongoDB 的设计理念。 什么是 MongoDB ObjectID? 在 MongoDB …...
CUDA 计时功能,记录GPU程序/函数耗时,cudaEventCreate,cudaEventRecord,cudaEventElapsedTime
为了测试GPU函数的耗时,可以使用 CUDA 提供的计时功能:cudaEventCreate, cudaEventRecord, 和 cudaEventElapsedTime。这些函数可以帮助你测量某个 CUDA 操作(如设置设备)所花费的时间。 一、记录耗时案例 以下是一个示例程序&a…...
PDF 文件如何转为 CAD 图纸?PDF2CAD 使用教程
在工程设计和建筑行业中,PDF 文件常常被用来分享和存档图纸。然而,当需要对这些图纸进行编辑或进一步开发时,静态的 PDF 格式就显得力不从心了。这时候,将 PDF 文件转换为可编辑的 CAD(计算机辅助设计)格式…...
【YashanDB知识库】php查询超过256长度字符串,数据被截断的问题
本文内容来自YashanDB官网,原文内容请见:https://www.yashandb.com/newsinfo/7488290.html?templateId1718516 问题现象 如下图,php使用odbc数据源,查询表数据,mysql可以显示出来,yashan显示数据被截断。…...
暴雨AI加速计算服务器新品X8840上市
用户输入简短的文字,大模型可以自动生成创意文本或图像;金融机构的风险评估和预测,大模型通过对金融数据的分析,可以识别异常交易行为;15秒内完成中英文作文的批改和评分,并提供针对性的改进建议࿰…...
在多个分布式机器间设置和使用 NFS(Network File System)共享目录的步骤如下:
在多个分布式机器间设置和使用 NFS(Network File System)共享目录的步骤如下: 1. 准备工作 确保所有参与的机器都在同一个网络中,并安装了 NFS 软件包。 在 Linux 系统上: sudo apt update && sudo apt install nfs-kernel-server -y # Ubuntu/Debian sudo yu…...
机器学习中的 Transformer 简介(第 1 部分)
目录 一、说明 二、为什么是 Transformer? 三、什么是 Transformer? 3.1 译者的类比 四、编码器部分 4.1 、从文本输入到输入嵌入 4.2 词嵌入 4.2 N倍编码器段 4.4 多头注意力机制 4.5 添加残差和层归一化 4.6 添加残差和层归一化 五、总结 一、说明 西如…...
D3实现站点路线图demo分享
分享一下通过D3实现的站点路线分布图,这是一个demo。效果图如下: 源码如下: <template><div class"map-test" ref"d3Chart"><div class"tooltip" id"popup-element"><span>…...
非文件形式的内存动态函数库调用接口
使用memfd的系统调用接口将动态库加载到proc虚拟文件系统,提供的fd为进程持有的句柄,通过dlopen的path指向此句柄,即可实现非文件系统加载动态链接库。 文章目录 一、memfd_create二、dl_open三、示例参考 一、memfd_create 接口名称int mem…...
liunx docker 部署 nacos seata sentinel
部署nacos 1.按要求创建好数据库 2.创建docker 容器 docker run -d --name nacos-server -p 8848:8848 -p 9848:9848 -p 9849:9849 -e MODEstandalone -e SPRING_DATASOURCE_PLATFORMmysql -e MYSQL_SERVICE_HOST172.17.251.166 -e MYSQL_SERVICE_DB_NAMEry-config -e MYSQL…...
解决没法docker pull问题
没想到国内源死差不多了,以下内容需要提前科学上网 su cd /etc/systemd/system/docker.service.d vim proxy.conf 参照下图修改,代理服务器改成你自己的。 [Service] Environment"HTTP_PROXYsocks5://192.168.176.180:10810" Environment&…...
面试小札:闪电五连鞭_2
1 请简单描述一下Java中的多线程。 多线程是指在一个程序中可以同时运行多个线程来执行不同的任务。在Java中,通过 java.lang.Thread 类来创建和控制线程。可以通过继承 Thread 类或者实现 Runnable 接口的方式来定义线程的执行逻辑。 线程有多种状态,…...
Milvus向量数据库06-RAG检索增强
Milvus向量数据库06-RAG检索增强 文章目录 Milvus向量数据库06-RAG检索增强1-学习目标2-参考网址3-执行过程记录1-到底什么是RAGRAG 的基本流程:为什么 RAG 优于传统的基于检索的方法:示例流程: 2-RAG和Elasticsearch对比3-RAG和向量数据库之…...
信创国产化时代:打造安全高效的信创网站解决方案
在全球科技竞争日益激烈的背景下,信创国产化已经成为中国信息技术领域的重要战略选择。信创国产化,即信息技术应用创新与国产化,旨在通过自主研发和创新,推动核心技术的国产化,减少对外部技术的依赖,确保国…...
python编程Day13-异常介绍捕获异常抛出异常
异常 介绍 1, 程序在运行时, 如果Python解释器遇到到一个错误, 则会停 止程序的执行, 并且提示一些错误信息, 这就是异常. 2, 程序停止执行并且提示错误信息这个动作, 通常称之为: 抛出 (raise) 异常 # f open(aaaa.txt) # FileNotFoundError: [Errno 2] No such file or dire…...
【JAVA高级篇教学】第二篇:使用 Redisson 实现高效限流机制
在高并发系统中,限流是一项非常重要的技术手段,用于保护后端服务,防止因流量过大导致系统崩溃。本文将详细介绍如何使用 Redisson 提供的 RRateLimiter 实现分布式限流,以及其原理、使用场景和完整代码示例。 目录 一、什么是限流…...
力扣-图论-8【算法学习day.58】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
Spring 中的验证、数据绑定和类型转换
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
Github----提交人不是自己
账号用户名都设置对的,但是提交人不是自己 解决 发现是用户名和账号都夹了"号导致 git config --global user.name "Your Name" git config --global user.email "your.emailexample.com"不用引号 git config --global user.name Your Name git …...
常用工具软件
前言 之前汇总过一篇嵌入式开发工具,但是掺杂了一些更偏向于日常使用的软件工具,这里单独提出来分享,都是自己在用的。 1.文件对比工具 BeyondCompare 文件对比利器,添加右键快捷键后。选中两个文件,右键可以直接进…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
