【问题标题】:Embedded document without Array?没有数组的嵌入文档?
【发布时间】:2013-11-07 06:50:24
【问题描述】:

我了解如何在 Mongoose 中使用 embed documents,如果存储为数组,它们看起来相当简单,其用例相当明显:

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

【问题讨论】:

标签: mongodb express mongoose


【解决方案1】:

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

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

这里的答案是不共享架构,而只是共享定义。

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

这将产生一个嵌套的用户对象,而实际上并没有嵌套架构。

【讨论】:

  • 这样做有什么后果吗?我的意思是嵌套对象而不是模式?
【解决方案2】:

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

我建议使用数组长度验证

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

【讨论】:

    【解决方案3】:

    更新:

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 1970-01-01
      • 2018-07-24
      • 2013-03-02
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      相关资源
      最近更新 更多