MongoDB-ObjectID 生成器

news2024/12/12 17:13:57

主页.png

前言

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-45-910-1112-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 作为自定义的 ID
  name: "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 字段的生成方式。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2258341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM学习(36)静态扫描规则学习以及工具使用

笔者来学习了解一下静态扫描以及其规则,并且亲身是实践一下对arm 架构的代码进行扫描。 1、静态扫描认识 静态扫描:对代码源文件按照一定的规则进行扫描,来发现一些潜在的问题或者风险,因为不涉及代码运行,所以其一般只是发现一些规范或则一些质量问题,当然这些可能存在潜…

从 Zuul 迁移到 Spring Cloud Gateway:一步步实现服务网关的升级

从 Zuul 迁移到 Spring Cloud Gateway:一步步实现服务网关的升级 迁移前的准备工作迁移步骤详解第一步:查看源码第二步:启动类迁移第三步:引入 Gateway 依赖第四步 编写bootstrap.yaml第五步:替换路由配置第六步&#…

centos部署SkyWalking并在springcloud项目中用法举例

文章目录 场景SkyWalking介绍部署部署Storage [单机版Elasticsearch]部署SkyWalking OAP [下载地址](https://skywalking.apache.org/downloads/#SkyWalkingAPM)部署SkyWalking Java Agent springCloud 使用举例 场景 SkyWalking是应用性能监控平台,可用于分布式系统…

如何借助5G网关实现油罐车安全在线监测

油罐车是常见的特种运输车辆,用以运送各种汽油、柴油、原油等油品,运输危险系数大,而且由于油罐车需要经常行驶在城区道路,为城市各个加油站点、企业工厂运输补充所需油料,因此也是危化品运输车辆的重点监测和管控对象…

【总结·反思·汇报·思考02】裸辞后,我的一些感想和感悟。

Hello,大家好! 首先,我需要向大家道个歉,对不起!因为最近发生了一些事情,博客文章一直没有更新。(90度鞠躬道歉) 那么,最近到底发生了什么呢?相信大家已经从…

李宏毅机器学习-局部最小值与鞍点

一、Optimization Fails because …… 1. 问题 在optimization时,training的loss不会再下降,但是我们对loss并不满意。不管我们怎么更新参数,loss都不会掉下来。 2. 原因:critical point(gra…

day10性能测试(2)——Jmeter安装环境+线程组+Jmeter参数化

【没有所谓的运气🍬,只有绝对的努力✊】 目录 1、LoadRunner vs Jmeter 1.1 LoadRunner 1.2 Jmeter 1.3 对比小结 2、Jmeter 环境安装 2.1 安装jdk 2.2 安装Jmeter 2.3 小结 3、Jmeter 文件目录结构 4、Jmeter默认配置修改 5、Jmeter元件、组…

STM32软件IIC驱动TCA9548A多路测量AHT10

STM32软件IIC驱动TCA9548多路测量AHT10 TCA9548AAHT10代码逻辑代码展示现象总结 TCA9548A TCA9548A 有八个可通过 I2C 总线控制的双向转换开关,SCL/SDA 上行对扩展到八个下行对,或者通道,适用于系统中存在I2C目标地址冲突的情况。8路双向转换…

鸿蒙调试打包(非正式打包)

文章目录 前言第一步:生成.p12和.csr文件第二步:申请证书的前置步骤第三步:申请证书 前言 HarmonyOS 应用打包后的文件为.app 格式, android 打包后的文件为.apk,IOS 打包后的文件为.apa HarmonyOS通过数字证书&#…

手机租赁系统开发全流程解析与实用指南

内容概要 在如今快速发展的科技时代,手机租赁系统已经成为一种新兴的商业模式,非常符合当下市场需求。那么,在开发这样一个系统的时候,首先要从需求分析和市场调研开始。在这一阶段,你需要了解用户需要什么&#xff0…

C++是如何工作的?

首先来看一个最基本的C程序段。 #include <iostream>int main() {std::cout << "HelloWorld" << std::endl;std::cin.get(); } 第一行 #include 的含义是预处理的意思&#xff0c;这条语句的作用是将一个名为iostream的文件拷贝到源代码中这个…

在 Windows WSL 上部署 Ollama 和大语言模型:从镜像冗余问题看 Docker 最佳实践20241208

&#x1f6e0;️ 在 Windows WSL 上部署 Ollama 和大语言模型&#xff1a;从镜像冗余问题看 Docker 最佳实践 ⭐ 引言 随着大语言模型&#xff08;LLM&#xff09;和人工智能技术的迅猛发展&#xff0c;开发者们越来越多地尝试在本地环境中部署模型进行实验。 但部署过程中常…

2、开发环境优化与创建第一个插件程序

一、创建测试用例二、vscode优化2.1 修改默认终端为普通cmd2.2 配置一键编译&&运行&&监视一、创建测试用例 使用命令yo code生成一个测试用例,选择或输入下面的内容。2. 命令的最后会提示是否使用vscode打开,选择打开就行。 3. 在当前目录下会产生helloworld…

公有云和私有云的区别

目录 ​1、公有云&#xff08;PublicClouds&#xff09; ​2、私有云&#xff08;PrivateClouds&#xff09; ​2.1 私有云又分为两种 3、混合云&#xff08;hybrid cloud&#xff09; ​3.1 公有云和私有云的区别 ​3.2 选择公有云或者是私有云 4 政务云&#xff08;Go…

TortoiseGit的下载、安装和配置

一、TortoiseGit的简介 tortoiseGit是一个开放的git版本控制系统的源客户端&#xff0c;支持Winxp/vista/win7.该软件功能和git一样 不同的是&#xff1a;git是命令行操作模式&#xff0c;tortoiseGit界面化操作模式&#xff0c;不用记git相关命令就可以直接操作&#xff0c;读…

jmeter调整字号无法生效?

调整之前如上图&#xff0c;字体非常小&#xff0c;哪怕我设置的字号是48 查阅了资料&#xff0c;试了几次&#xff0c;解决办法如下&#xff1a; 用编辑器打开jmeter.bat 在echo off的下一行添加以下代码 set JVM_ARGS%JVM_ARGS% -Dswing.plaf.metal.controlFontDialog-20…

【实操GPT-SoVits】声音克隆模型图文版教程

项目github地址&#xff1a;https://github.com/RVC-Boss/GPT-SoVITS.git官方教程&#xff1a;https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/tkemqe8vzhadfpeu本文旨在迅速实操GPT-SoVits项目&#xff0c;不阐述技术原理&#xff08;后期如果有时间研究&#…

【Web】2023安洵杯第六届网络安全挑战赛 WP

目录 Whats my name easy_unserialize signal Swagger docs 赛题链接&#xff1a;GitHub - D0g3-Lab/i-SOON_CTF_2023: 2023 第六届安洵杯 题目环境/源码 Whats my name 第一段正则用于匹配以 include 结尾的字符串&#xff0c;并且在 include 之前&#xff0c;可以有任…

大模型简单实践

大模型简单实践 最近参加了Datawhale AI冬令营&#xff08;第一期&#xff09;的活动 网站链接 手把手教学&#xff0c;借助Chat-嬛嬛 搭上讯飞星辰MaaS平台&#xff0c;快速训练处一个可以自由聊天的对话机器人。

Linux的基本功能和命令

Linux的基本功能和命令 切换目录 pwd 查询当前目录地址 cd /xxx/xxx 转到目录 cd …/ 回到上一级目录 cd ./ 当前目录 创建、删除文件/文件夹 创建文件\文件夹 touch filename 创建空文件mkdir 创建目录 mkdir -p 目标目录存在也不报错mkdir -p xxx/xxx 递归创建目录…