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 文件对比利器,添加右键快捷键后。选中两个文件,右键可以直接进…...

Oracle报错ORA-01653: 表xx无法通过 8192在表空间中扩展
向Oracle 19g数据库中批量插入数据,当插入近2亿条数据后,报出如下错误: ORA-01653: 表xx无法通过 8192 (在表空间 xx_data 中) 扩展 查看表空间,发现表空间大小已达到32G,表空间无法进行自动扩展了。(初始…...

【C语言】库函数常见的陷阱与缺陷(3):内存分配函数
目录 一、malloc 函数 1.1. 功能与常见用法 1.2. 陷阱与缺陷 1.3. 安全使用建议 1.4. 安全替代和代码示例 二、calloc 函数 2.1. 功能与常见用法 2.2. 陷阱与缺陷 2.3. 安全使用建议 2.4. 安全替代和代码示例 三、realloc 函数 3.1. 功能与常见用法 3.2. 陷阱与缺…...

Vue前端实现预览并打印PDF文档
一. 需求 1. 点击文档列表中的【打印】按钮,获取后台生成的PDF的url,弹窗进行预览: 2. 点击【打印】按钮,进行打印预览和打印: 二. 需求实现 首先后台给的是word文档,研究了一圈后发现暂时无法实现&…...

CSS学习记录07
CSS轮廓 轮廓是在元素周围绘制的一条线,在边框之外,以凸显元素。 CSS拥有如下轮廓属性: outline-styleoutline-coloroutline-widthoutline-offsetoutline 注意:轮廓与边框不同。不同之处在于:轮廓是在元素边框之外…...

喆塔科技携手国家级创新中心,共建高性能集成电路数智化未来
集创新之力成数智之塔 近日,喆塔科技与国家集成电路创新中心携手共建“高性能集成电路数智化联合工程中心”并举行签约揭牌仪式。出席此次活动的领导嘉宾包含:上海市经济和信息化委员会、上海市集成电路行业协会、复旦大学微电子学院、国家集成电路创新中…...

基于单片机的汽车雨刷器装置
摘要 下雨天时道路十分模糊,能见度非常低,司机分散注意力去手动打开雨刷器开关会非常危险。据统计,全世界雨天行车的车祸事故有7%是因为司机手动打开雨刷分心导致的。为了减小司机因为手动打开雨刷发生车祸的概率,所以…...

013-SpringBoot 定义优雅的全局异常处理方式
SpringBoot 定义优雅的全局异常处理方式 一、概述二、定义全局异常接口三、定义全局异常枚举四、定义全局基础异常五、定义全局基础业务异常六、定义全局返回七、定义全局返回工厂八、全局异常处理九、实体类十、Controller十一、效果展示一、概述 在日常项目开发中,异常是常…...

nginx 网页正常访问 F5 404
前端打包部署完,无论pc-web或h5-wap,访问正常,一刷新就会404。 解决方案: 在项目的nginx子配置文件中,加上以下代码 try_files $uri $uri/ /index.html;...

Idea Spring Initializr没有 Java 8选项解决办法
问题描述 在使用IDEA中的Spring Initializr创建新项目时,Java 版本近可选择Java17,21 。不能选择Java8;SpringBoot 版本也只有 3.x 问题原因 Spring 官方( https://start.spring.io/)不再提供旧版本的初始化配置 解决方案 方案 1 使用阿里…...

【Leetcode Top 100】104. 二叉树的最大深度
问题背景 给定一个二叉树 r o o t root root,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 数据约束 树中节点的数量在 [ 0 , 1 0 4 ] [0, 10 ^ 4] [0,104] 区间内。 − 100 ≤ N o d e . v a l ≤ 100 -100 \le Nod…...