.NET生成MongoDB中的主键ObjectId

💡 原文中文,约25900字,阅读约需62分钟。
📝

内容提要

本文介绍了在创建MongoDB数据时生成主键的方法。作者发现在C# MongoDB驱动mongo-csharp-driver中有ObjectId.GenerateNewId()方法可以直接调用,无需重新设计。ObjectId是MongoDB中用于表示主键的类型,它使用12字节的存储空间,可以存储24个十六进制数字组成的字符串。文章还介绍了如何安装MongoDB.Driver驱动和ObjectId的生成原理。

🔎

延伸解读

ObjectId 的分布式设计优势

文章指出 MongoDB 设计为分布式数据库,使用 ObjectId 作为主键可以避免不同数据库中 _id 重复。如果采用自增方式,在分布式系统中会出现重复的 _id 值。ObjectId 通过结合时间戳、机器码、进程 ID 和计数器,在分布式环境下生成唯一标识,适合多节点部署场景。

ObjectId 的生成原理与结构

ObjectId 使用 12 字节存储,由 4 字节 Unix 时间戳、3 字节机器码、2 字节进程 ID 和 3 字节计数器组成。计数器初始化为随机值,每次生成时通过 Interlocked.Increment 递增,确保同一进程内生成的 ID 唯一。这种结构使得 ObjectId 大致按时间顺序生成,有利于索引性能。

在 C# 中生成 ObjectId 的便捷方法

通过安装 MongoDB.Driver 驱动,开发者可以直接调用 ObjectId.GenerateNewId() 生成主键,无需自行实现 ObjectId 生成逻辑。该方法基于当前 UTC 时间生成时间戳部分,并自动处理机器码、进程 ID 和计数器,简化了在创建数据前预生成主键的流程。

❓

Q&A

在C#中如何为MongoDB生成主键ObjectId?

可以直接调用C# MongoDB驱动提供的ObjectId.GenerateNewId()方法生成主键,例如:var primarykeyId = ObjectId.GenerateNewId();

MongoDB的ObjectId由哪些部分组成?

ObjectId使用12字节存储,包括:4字节Unix时间戳、3字节机器ID、2字节进程ID和3字节计数器(初始化随机)。

如何安装MongoDB.Driver驱动?

可以通过NuGet包管理器控制台执行命令Install-Package MongoDB.Driver自动安装,也可以在NuGet中搜索手动安装。

为什么MongoDB使用ObjectId作为主键而不是自增ID?

因为MongoDB设计为分布式数据库,使用ObjectId可以避免不同数据库中_id的重复,而自增方式在分布式系统中会出现重复的_id值。

ObjectId的生成原理是什么?

ObjectId的生成原理涉及时间戳、机器码、进程ID和计数器的组合,具体实现可以参考mongo-csharp-driver的源码,源码地址在GitHub上。

ObjectId的字符串表示形式是怎样的?

ObjectId可以存储24个十六进制数字组成的字符串,例如:641c54b2e674000035001dc2。

🏷️

标签

➡️

继续阅读