Mongodb 没有数组的嵌入式文档?

Mongodb 没有数组的嵌入式文档?,mongodb,express,mongoose,Mongodb,Express,Mongoose,我了解如何在Mongoose中进行存储,如果将它们存储为数组,则它们看起来相当简单,对于这种情况,用例非常明显: var CommentSchema = new Mongoose.Schema({...}); var BlogPostSchema = new Mongoose.Schema({ comments : [CommentSchema], }); 但是,在向前和向后查看文档之后,我不知道如何存储不需要或不希望位于数组中的单个子文档 var UserSchema = new M

我了解如何在Mongoose中进行存储,如果将它们存储为数组,则它们看起来相当简单,对于这种情况,用例非常明显:

var CommentSchema = new Mongoose.Schema({...});
var BlogPostSchema = new Mongoose.Schema({
    comments : [CommentSchema],
});
但是,在向前和向后查看文档之后,我不知道如何存储不需要或不希望位于数组中的单个子文档

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

有什么办法可以让这一切顺利进行吗?我不想只存储ObjectId,而是存储用户记录的完整副本,但不需要或想要数组

不能以这种方式嵌入模式,因为这些子文档可能会与完整文档混淆,请参见,其中说明:

我们过去没有添加这种支持的原因是b/c,这让我们怀疑是否所有预钩子都将以相同的方式对伪子文档执行,这意味着我们可以对该子文档调用save()

这里的答案不是共享模式,而是共享定义

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

这将导致嵌套的用户对象,而不实际嵌套架构。

仅共享信息不支持验证冒泡。您可能还需要验证UserSchema

相反,我建议进行数组长度验证

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

如果现在有人遇到这种情况,从Mongoose 4.2.0开始,就存在单个嵌入式子文档!:)


这有什么后果吗?我的意思是嵌套对象而不是模式?从4.2.0版开始就可以这样做,请参见