2014-12-02 169 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的幫助。