2014-12-02 112 views
4

我有一个关于嵌套猫鼬模式的问题。猫鼬错误:嵌套模式

下面是一个简单的代码片段

var aSchema = new Schema({bar: String}); 
var bSchema = new Schema({a: aSchema, foo: String}); 
var cSchema = new Schema({as: [aSchema], foo:String}); 

这将在bSchema抛出TypeErrorTypeError: Undefined type at 's' Did you try nesting Schemas? You can only nest using refs or arrays.,但cSchema工作正常。

只想问为什么bSchema不起作用。在Mongoose文档中找不到解释。谢谢。

+0

'bSchema'的'a'属性应该是对'aSchema'对象的引用吗?不要这样做。做:'a:{type:Mongoose.Schema.ObjectId',ref:'a'}''ref:a'中的'a'是您使用'aSchema'创建的猫鼬模型的名称 – 2014-12-02 21:44:42

回答

3

MongoDB是而不是的关系数据库。这可能会导致一些习惯RDBS模型的人感到困惑(我偶尔会被绊倒......但我真的不是一个DB人)。

很多时候,您会发现在您的Mongo实体中引用其他文档是有益的。猫鼬模式提供了一种非常简单而有效的方式来做到这一点,感觉非常关系。

当定义将存储对不同类型文档的引用的模式时,可以将相关属性定义为typeref的对象。通常在定义模式属性时,可以简单地说:a: Number;然而,猫鼬提供了许多不同的选项比其它类型的架构属性:

a: { 
    type: Number, 
    required: true 
} 

设置required: true将阻止我们保存文档,其中a属性不存在。

一旦你了解如何与对象定义定义模式,您可以利用猫鼬的人口机械:

a: { 
    type: Mongoose.Schema.ObjectId, 
    ref: 'a' 
} 

这告诉猫鼬到特定a文件ObjectId(特定的猫鼬标识符)存储为我们的模式的a属性。还跟着我?

在Mongoose文档上设置此属性时,可以简单地说:doc.a = myA。当您去保存doc时,Mongoose会自动进行转换,并只将ID存储在您的数据库中。

当检索引用另一个模式的文档时,您需要填充。我不会去那,但它很简单 - check out the documentation

0

我正面临这个问题,因为我对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的帮助。