Mongoose / MongoDB中嵌套模式的正确模式是什么?

时间:2013-03-14 15:36:34

标签: node.js mongodb mongoose

对我来说,做以下事情似乎是合乎逻辑的:

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。

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

谢谢!

2 个答案:

答案 0 :(得分:6)

我相信你的假设是正确的,它在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);

免责声明:我不一定会在项目之前加上逗号!

答案 1 :(得分:4)

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

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