声明 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 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 通过参考搜索自动填充数据

具有多个子路径的猫鼬填充路径

从 mongoDB 获取计数

Mongoose - 填充删除的空引用?

MongoDB - 查找两个集合之间的差异

mongoose关联表结构