Mongoose 中 id 和 _id 的区别是什么?

在 Mongoose 中,每个文档都有一个唯一的标识符。这个标识符可以通过 id_id 属性来访问。虽然这两个属性看起来很相似,但它们之间确实有一些重要的区别。

id

id 是 Mongoose 中默认的主键。当我们定义模型时,如果没有指定主键,Mongoose 会自动创建一个名为 _id 的主键,并将其存储为 ObjectId 类型的值。因此,如果您使用默认配置并访问 id 属性,则返回的值将是 _id 属性的字符串表示形式。

----- ---------- - --- -----------------
  ----- -------
---

----- ---- - ---------------------- ------------

----- ------- - --- ------ ----- ------ ---
------------------------ -- --------------------------

在上面的示例中,由于我们没有指定主键,Mongoose 自动创建了一个 _id 属性,并将其转换为字符串表示形式的值存储在 id 属性中。

_id

_id 是 MongoDB 中的内置主键属性。无论您是否在模型中指定主键,Mongoose 都会将 _id 存储在每个文档中。与 id 不同,_id 始终是 ObjectId 类型的值。

----- ---------- - --- -----------------
  ----- -------
  ---- ------- -- ---------
---

----- ---- - ---------------------- ------------

----- ------- - --- ------ ----- ------- ---- - ---
------------------------ -- ---

在上面的示例中,我们指定了 _id 属性的值为数字类型。当我们访问 newUser.id 时,将返回数字类型的主键值。

区别

最显而易见的区别是它们所代表的值的数据类型不同。 id 是字符串表示形式的 ObjectId 值,而 _id 是实际的 ObjectId 值。这意味着您可以在使用 id 时跳过解析步骤,但需要在使用 _id 时进行解析操作。

另一个重要的区别是,如果您在模型中定义了自定义主键,则无法通过 id 属性来访问它。在这种情况下,您必须使用 _id 属性来访问主键。

----- ---------- - --- -----------------
  ------- - ----- ------- ------- ---- --
  ----- -------
---

----- ---- - ---------------------- ------------

----- ------- - --- ------ ------- ------ ----- ------ ---
------------------------- -- ------------------------------------
------------------------ -- ---------

在上面的示例中,我们定义了一个名为 userId 的自定义主键。当我们访问 newUser.id 时,将返回 undefined,因为没有名为 id 的属性在模型中定义。

总结

  • id 是 Mongoose 中默认的主键,存储 _id 属性的字符串表示形式。
  • _id 是 MongoDB 中的内置主键属性,始终是 ObjectId 类型的值。
  • 当使用自定义主键时,只能通过 _id 属性来访问它。
  • 在使用 _id 时需要进行解析操作,而 id 可以直接使用。

在实际开发中,选择使用哪个主键属性取决于您的具体需求。如果您不需要直接使用原始 ObjectId 值,则可以使用 id 属性来方便地访问主键。如果您需要更多的灵活性,则可以使用自定义主键并访问 _id 属性来获得

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/28605