2013-10-28 81 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 }},