2013-10-28 116 views
20

我知道如何在embed documents貓鼬,他們似乎相當簡單,如果存儲爲數組,爲此,使用情況是相當明顯的:沒有陣列的嵌入式文檔?

var CommentSchema = new Mongoose.Schema({...}); 
var BlogPostSchema = new Mongoose.Schema({ 
    comments : [CommentSchema], 
}); 

但是,我不看怎麼看結束後做文檔向前和向後是如何存儲不需要或不想要在Array中的單個子文檔。

var UserSchema = new Mongoose.Schema({...}); 
var BlogPostSchema = new Mongoose.Schema({ 
    author: ??? // 'UserSchema' and UserSchema do not work here. 
}); 

有什麼辦法可以使這項工作?我不想只存儲ObjectId,而是存儲用戶記錄的完整副本,但不需要或不需要數組。

+1

你能做到這一點,因爲4.2.0版本,請參閱http://mongoosejs.com/docs/subdocs.html#single-embedded – kba

回答

18

你不能嵌入模式以這種方式,與推理,那些孩子的文檔會以飽滿的文件相混淆,見this bug thread,其中指出:

我們還沒有加入這個支持的原因過去是b/c,這讓我們想知道是否所有的pre-hooks都將以僞子文檔的相同方式執行,並且這意味着我們可以調用save()該子項。

這裏的答案是共享不是架構,而只是定義。

var userdef = { name: String }; 
var UserSchema = new Schema(userdef); 
var BlogPostSchema = new Schema({author: userdef}); 

這將導致嵌套的用戶對象,而不實際嵌套架構。

+0

是否有這個什麼後果嗎?我的意思是嵌套對象而不是模式? – scaryguy

1

只是共享信息不支持驗證冒泡。你也可能需要驗證UserSchema。

相反,我建議數組長度驗證

author: {type:[UserSchema], validate: function (arr) { return arr.length == 1 }},