我对嵌套Mongoose架构有疑问。
这是一个简单的代码段
var aSchema = new Schema({bar: String});
var bSchema = new Schema({a: aSchema, foo: String});
var cSchema = new Schema({as: [aSchema], foo:String});
这会将TypeError
投放到bSchema
:TypeError: Undefined type at 's' Did you try nesting Schemas? You can only nest using refs or arrays.
,但适用于cSchema
。
只想问为什么bSchema
不起作用。在Mongoose doc中找不到解释。感谢。
答案 0 :(得分:8)
MongoDB 不关系数据库。这可能会让一些习惯RDBS模型的人感到困惑(我偶尔也会绊倒......但我真的不是数据库人员。)
通常,您会发现在Mongo实体中引用其他文档是有益的。 Mongoose模式提供了一种非常简单有效的方法来实现这种感觉非常关系。
定义将存储对不同类型文档的引用的架构时,将相关属性定义为具有type
和ref
的对象。通常,在定义架构属性时,您可以简单地说:a: Number
;但是,Mongoose为类型以外的架构属性提供了许多不同的选项:
a: {
type: Number,
required: true
}
设置required: true
会阻止我们保存不存在a
属性的文档。
了解了如何使用对象定义定义模式后,您可以利用Mongoose的人口机制:
a: {
type: Mongoose.Schema.ObjectId,
ref: 'a'
}
这告诉Mongoose将特定ObjectId
文档的a
(特定于Mongoose的标识符)存储为我们架构的a
属性。还在跟着我?
在Mongoose文档上设置此属性时,您只需说:doc.a = myA
。当您去保存doc
时,Mongoose将自动进行转换,并仅将ID存储在您的数据库中。
检索引用其他架构的文档时,您需要填充。我不会进入那个,但它非常简单 - check out the documentation。
答案 1 :(得分:2)
我遇到了这个问题,因为我对 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 的帮助下使用指向我的其他架构。