What is the proper pattern for nested schemas in Mongoose/MongoDB?

mongodb, mongoose, node.js

Solution

I believe you are correct in your assumptions, it's called Embedded documents in Mongoose, here is the example from the Mongoose documentation.

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);

Disclaimer: I wouldn't necessarily put the comma before the items!

Problem

It seems logical to me to do something like the following: ``` 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] }); ``` Then later on. . .do something like the following: ``` var question = new Question({ question: 'Wut?', users: users //where users is an array of instances of a user model of the UserSchema }); ``` Here I would expect the users section of the question to be populated with avatars, emails, firstnames and lastnames. . .however since the users/avatars already have _id, these are not persisted. - Deleting each of the _id from the user/avatars seems silly. - Explicitly setting up each user/avatar seems inefficient. - Switching to a mixed type, puts EVERYTHING in there, and requires markModified. What is the proper pattern for these sorts of schemas? Thanks!

Original source