声明mongoose.Schema.Types.ObjectId的目的是什么?

时间:2018-09-26 09:13:30

标签: node.js mongodb mongoose nosql

我一直在浏览一些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”,这有什么好处呢?我的意思是,无论他们定义还是不存在?

2 个答案:

答案 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一样。