在 Mongoose 中,每个文档都有一个唯一的标识符。这个标识符可以通过 id
或 _id
属性来访问。虽然这两个属性看起来很相似,但它们之间确实有一些重要的区别。
id
id
是 Mongoose 中默认的主键。当我们定义模型时,如果没有指定主键,Mongoose 会自动创建一个名为 _id
的主键,并将其存储为 ObjectId 类型的值。因此,如果您使用默认配置并访问 id
属性,则返回的值将是 _id
属性的字符串表示形式。
const userSchema = new mongoose.Schema({ name: String, }); const User = mongoose.model('User', userSchema); const newUser = new User({ name: 'John' }); console.log(newUser.id); // '60de5bf14a6f8dcb0d978bfb'
在上面的示例中,由于我们没有指定主键,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