声明 mongoose.Schema.Types.ObjectId 的目的是啥?
Posted
技术标签:
【中文标题】声明 mongoose.Schema.Types.ObjectId 的目的是啥?【英文标题】:what is the purpose of declaring mongoose.Schema.Types.ObjectId?声明 mongoose.Schema.Types.ObjectId 的目的是什么? 【发布时间】:2019-03-02 00:24:12 【问题描述】:我一直在浏览一些 nodejs/mongoose 代码,我意识到有一些代码在尝试将数据存储在 mongodb-mongoose 中时明确定义了 _id 字段。
例子
var personSchema = Schema(
_id: mongoose.Schema.Types.ObjectId,
name: String,
age: Number,
stories: [ type: Schema.Types.ObjectId, ref: 'Story' ]
);
我知道 Mongodb 中的文档默认分配了一个唯一的 _id 字段。那为什么还有人要定义“_id: mongoose.Schema.Types.ObjectId”,这有什么好处呢?我的意思是,不管他们定义与否,它不会仍然存在吗?
【问题讨论】:
【参考方案1】:Mongoose 架构旨在在每个创建的文档或子文档(嵌入)条目中添加 _id
字段。
声明_id
字段仅在模式中有用,当您想要将模型文档的某些字段嵌入为子文档而不是添加带有原始 id 的 ref
时,否则它将添加新生成的 ObjectId
作为_id
在子文档架构中。
【讨论】:
【参考方案2】:从技术上讲,在***架构级别声明与否之间没有变化。
正如documentation of mongoose 所说:
默认情况下,Mongoose 会为您的每个模式分配一个 _id 字段,如果有的话 没有传递到 Schema 构造函数中。分配的类型是一个 ObjectId 以符合 MongoDB 的默认行为。
有些人可能会添加它以使其明确:_id
字段存在并且它是ObjectId
。
注意在子模式中,_id
可以使用 _id
选项禁用
选项:
_id Mongoose 为您的每个模式分配一个 _id 字段 如果未将一个传递给 Schema 构造函数,则为默认值。方式 分配的是一个 ObjectId 以符合 MongoDB 的默认行为。 如果您根本不想将 _id 添加到您的架构中,您可以禁用 它使用这个选项。
您只能在子文档上使用此选项。猫鼬无法保存 不知道其 id 的文档,因此如果您尝试会收到错误消息 保存没有 _id 的文档。
// default behavior
var schema = new Schema( name: String );
var Page = mongoose.model('Page', schema);
var p = new Page( name: 'mongodb.org' );
console.log(p); // _id: '50341373e894ad16347efe01', name: 'mongodb.org'
// disabled _id
var childSchema = new Schema( name: String , _id: false );
var parentSchema = new Schema( children: [childSchema] );
var Model = mongoose.model('Model', parentSchema);
Model.create( children: [ name: 'Luke' ] , function(error, doc)
// doc.children[0]._id will be undefined
);
【讨论】:
以上是关于声明 mongoose.Schema.Types.ObjectId 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章