在 MongoDB 数据库中,每个文档必须包含一个唯一的 _id
属性。Mongoose 是一个流行的 Node.js ODM(对象文档映射器),它为我们提供了一个 ObjectId
类型,用于创建 _id
属性。本文将介绍 ObjectId
类型,以及如何在 Mongoose 中使用它。
ObjectId 类型
在 Mongoose 中,ObjectId
类型是一个特殊的构造函数,用于生成一个唯一的 MongoDB _id
。ObjectId
实际上是一个 12 字节的 BSON 类型,由以下 3 个部分组成:
- 时间戳(4 字节):表示这个
_id
是在什么时间生成的 - 机器标识(3 字节):表示生成这个
_id
的机器的标识 - 进程 ID(2 字节):表示在这台机器上的哪个进程生成了这个
_id
- 计数器(3 字节):表示生成
_id
的顺序,可以保证唯一性
ObjectId
类型是通过 mongoose.Types.ObjectId
获取的,可以在模型定义或数据保存时使用。下面我们来看一个示例代码:
----- -------- - -------------------- ----- ------ - ---------------- ----- ---------- - --- -------- ----- - ----- ------ -- ---- - ----- ------------------------ -------- ----------------------- - --- ----- ---- - ---------------------- ------------ ----- ---- - --- ------ ----- ---- --- ---------------------- -- ------------------------
在这个示例中,我们定义了一个用户模型,其中包含 _id
和 name
两个属性。_id
使用了 mongoose.Types.ObjectId
类型,并设置了默认值。在实例化用户模型后,我们可以看到 _id
属性已经生成了一个 24 位的字符串。这是因为 ObjectId
类型本身是一个 12 字节的二进制数据,转换成了 24 位的十六进制字符串。
ObjectID 的应用场景
ObjectId
的主要应用场景是在 Mongoose 中定义模型时,设置 _id
属性的默认值。这样可以确保在数据保存之前就生成一个唯一的 _id
。如果不设置默认值,Mongoose 会自动生成一个 _id
,但是如果多次创建相同的文档,这些文档的 _id
可能并不是完全唯一的。
在实际的应用中,还可以使用 ObjectId
来查询文档,比如使用 findById
方法:
----- ---- - ----- ------------------------------------------
findById
方法会将查询参数字符串转换成 ObjectId
对象,并使用最快的可用索引查找匹配的文档。与字符串或其他类型的 _id
相比,使用 ObjectId
进行查找可以提供更高的性能。
总结
ObjectId
是 Mongoose 中用于生成 MongoDB_id
属性的特殊类型。ObjectId
由时间戳、机器标识、进程 ID 和计数器组成,可以保证唯一性。- 在模型定义中,可以使用
mongoose.Types.ObjectId
类型来定义_id
属性,设置默认值,以确保生成唯一的_id
。 - 在数据查询中,使用
ObjectId
进行查找可以提高性能。
希望这篇文章能够帮助你深入了解 ObjectId
类型,并在实际的 Mongoose 应用中得到应用。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6646d524d3423812e45029b1