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

jbg*_*jbg 26 mongoose mongodb node.js

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

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]
});
Run Code Online (Sandbox Code Playgroud)

然后是...do如下:

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

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

  • 从用户/头像中删除每个_id似乎很愚蠢.
  • 明确设置每个用户/头像似乎效率低下.
  • 切换到混合类型,将所有内容放在那里,并且需要markModified.

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

谢谢!

Nei*_*eil 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);
Run Code Online (Sandbox Code Playgroud)

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


Cap*_*paj 4

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

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

  • 填充确实会使用附加查询访问数据库,并且不允许从其他集合中选择不完整的字段。我认为 [subdocs](http://mongoosejs.com/docs/subdocs.html) 在这里更合适。 (4认同)