mongoose错误:嵌套模式
我有一个关于嵌套Mongoose模式的问题。
这是一个简单的代码片段
var aSchema = new Schema({bar: String}); var bSchema = new Schema({a: aSchema, foo: String}); var cSchema = new Schema({as: [aSchema], foo:String});
这将在bSchema
上抛出TypeError
: TypeError: Undefined type at 's' Did you try nesting Schemas? You can only nest using refs or arrays.
TypeError: Undefined type at 's' Did you try nesting Schemas? You can only nest using refs or arrays.
,但对于cSchema
工作正常。
只是想问为什么bSchema
不工作。 在Mongoose文档中找不到解释。 谢谢。
MongoDB 不是一个关系数据库。 这可能会导致一些习惯RDBS模式的人混淆(我偶尔会被绊倒……但我真的不是DB人)。
通常,您会发现在Mongo实体中引用其他文档是有益的。 mongoose模式提供了一个非常简单有效的方式来做到这一点,感觉非常关系。
在定义将存储对不同types文档的引用的模式时,可以将相关属性定义为具有type
和ref
的对象。 通常在定义模式属性时,可以简单地说: a: Number
; 然而,Mongoose为types以外的模式属性提供了许多不同的选项:
a: { type: Number, required: true }
required: true
设置required: true
将防止我们保存a
属性不存在的文档。
一旦你了解了如何用对象定义来定义你的模式,你可以利用Mongoose的人口机制:
a: { type: Mongoose.Schema.ObjectId, ref: 'a' }
这告诉Mongoose将特定文档的ObjectId
(一个特定于Mongoose的标识符)存储为我们模式的a
属性。 还是跟着我?
当在Mongoose文档上设置这个属性时,你可以简单地说: doc.a = myA
。 当你去保存doc
,Mongoose会自动进行转换,并只将ID存储在数据库中。
当检索引用另一个模式的文档时,您需要填充。 我不会去那,但它非常简单 – 检查文档 。
我正面临这个问题,因为我对MongoDB完全陌生 。 后来我发现我们需要在Mongoose的帮助下使用下面的关系。
以下是我国的模式。
var mongoose = require("mongoose"); var Schema = mongoose.Schema; var ObjectId = Schema.Types.ObjectId; var CountrySchema = new Schema({ name: { type: String, required: true }, activeStatus: Boolean, createdOn: Date, updatedOn: Date });
我可以在我的状态模式中使用这个模式,如下所示。
var mongoose = require("mongoose"); var Schema = mongoose.Schema; var ObjectId = Schema.Types.ObjectId; var StateSchema = new Schema({ name: { type: String, required: true }, country: {type: ObjectId, ref: "Country"}, activeStatus: Boolean, createdOn: Date, updatedOn: Date });
在这里,我正在使用ref的帮助指向我的其他架构。