26

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

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。

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

谢谢!

4

2 回答 2

8

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

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

于 2015-04-10T15:28:27.007 回答
4

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

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

于 2013-03-15T11:22:02.323 回答