我一直在浏览一些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”,这有什么好处呢?我的意思是,无论他们定义还是不存在?
答案 0 :(得分:1)
从技术上讲,在顶层模式级别声明还是不声明都没有变化。
正如documentation of mongoose所说:
猫鼬默认情况下为每个模式分配一个_id字段 没有传递给Schema构造函数。分配的类型是一个ObjectId,与MongoDB的默认行为一致。
某些人可能会添加它以便使其明确:_id
字段存在并且它是一个ObjectId
。
注意,在子模式中,可以使用_id
选项禁用_id
选项:
_id猫鼬通过以下方式为您的每个架构分配一个_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
});
答案 1 :(得分:0)
设计用于在每个已创建条目(文档或子文档(嵌入))中添加_id
字段的猫鼬模式。
声明_id
字段仅在模式中有用,当您要将模型文档的某些字段作为子文档嵌入而不是添加带有原始ID的ref
时,否则它将添加新生成的子文档架构中的ObjectId
与_id
一样。