【问题标题】:What is the proper pattern for nested schemas in Mongoose/MongoDB?Mongoose/MongoDB 中嵌套模式的正确模式是什么?
【发布时间】:2013-03-03 01:25:21
【问题描述】:

对我来说,执行以下操作似乎是合乎逻辑的:

var AvatarSchema = new Mongoose.Schema({
    type: String,
    url: String
});

var UserSchema = new Mongoose.Schema({
    avatars: [AvatarSchema],
    email: String,
    name: String,
    salt: String,
    token: String
});

var ThinUserSchema = new Mongoose.Schema({
    avatars: [AvatarSchema],
    email: String,
    firstname: String,
    lastname: String,
});

var QuestionSchema = new Mongoose.Schema({
    question: String,
    users: [ThinUserSchema]
});

以后再说吧。 . . 执行以下操作:

var question = new Question({
    question: 'Wut?',
    users: users //where users is an array of instances of a user model of the UserSchema
});

在这里,我希望问题的用户部分填充有头像、电子邮件、名字和姓氏。 . .但是由于用户/头像已经有_id,这些不会持久化。

  • 从用户/头像中删除每个 _id 似乎很愚蠢。
  • 显式设置每个用户/头像似乎效率低下。
  • 切换到混合类型,将所有内容都放入其中,并且需要 markModified。

这些模式的正确模式是什么?

谢谢!

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我相信你的假设是正确的,它在 Mongoose 中被称为嵌入式文档,这是来自 Mongoose 文档的示例。

    var Comments = new Schema({
        title     : String
      , body      : String
      , date      : Date
    });
    
    var BlogPost = new Schema({
        author    : ObjectId
      , title     : String
      , body      : String
      , date      : Date
      , comments  : [Comments]
      , meta      : {
            votes : Number
          , favs  : Number
        }
    });
    
    mongoose.model('BlogPost', BlogPost);
    

    免责声明:我不一定将逗号放在项目之前!

    【讨论】:

    • 保存前需要调用markModified('meta')吗?
    • 不,它应该保存文档的所有元素。
    【解决方案2】:

    我仍然是猫鼬菜鸟,如果我理解正确,我认为您需要阅读的是: http://mongoosejs.com/docs/populate.html

    有一个非常好的和简单的例子,你在其他模式中引用了模式。因此,为了将特定模式的文档包含在另一个文档中,最好通过引用包含它。当您需要它时,您可以在父文档上调用填充。当您更改子文档时,填充的父文档当然也会更改。

    【讨论】:

    • Populate 确实会通过附加查询访问数据库,并且它不允许从其他集合中选择不完整的字段。我觉得subdocs在这里更合适。
    猜你喜欢
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2016-05-06
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    相关资源
    最近更新 更多