20

我了解如何在 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,而是存储用户记录的完整副本,但不需要或不需要数组。

4

3 回答 3

18

您不能以这种方式嵌入模式,原因是这些子文档会与完整文档混淆,请参阅此错误线程,其中说明:

我们过去没有添加此支持的原因是 b/c 这让我们想知道是否所有预挂钩都将以相同的方式执行伪子文档,这意味着我们可以调用 save() on那个孩子。

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

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

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

于 2013-10-28T14:04:56.610 回答
1

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

相反,我建议使用数组长度验证

author: {type:[UserSchema], validate: function (arr) { return arr.length == 1 }},
于 2015-03-10T07:52:28.350 回答
0

更新:

万一现在有人遇到这个问题,从 Mongoose 4.2.0 开始,存在单个嵌入式子文档!:)

http://mongoosejs.com/docs/subdocs.html#single-embedded

于 2016-04-11T04:34:28.817 回答