Каков правильный шаблон для вложенных схем в Mongoose/MongoDB?

Мне кажется логичным сделать что-то вроде следующего:

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

Затем позже.,.do что-то вроде следующего:

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

Здесь я бы ожидал, что раздел пользователей вопроса будет заполнен аватарами, электронными письмами, firstnames и lastnames.,. Поскольку пользователи/аватары уже имеют _id, они не сохраняются.

  • Удаление каждого из _id от пользователя/аватаров кажется глупым.
  • Явная настройка каждого пользователя/аватара кажется неэффективной.
  • Переключение на смешанный тип, добавляет ВСЕ там и требует markModified.

Каков правильный шаблон для этих видов схем?

Спасибо!

Ответы

Ответ 1

Я все еще мангуст, но если я правильно понимаю, я думаю, что вам нужно прочитать следующее: http://mongoosejs.com/docs/populate.html

Существует очень хороший и простой пример, где вы ссылаетесь на схемы в других схемах. Поэтому, чтобы включить документ конкретной схемы внутри другого, лучше включить его через ссылку. Когда вам это нужно, вы вызываете заполнение в родительском документе. Когда вы меняете дочерний документ, заселенный родитель тоже будет меняться.

Ответ 2

Я считаю, что вы правы в своих предположениях, это называется встроенными документами в 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);

Отказ от ответственности: я бы не стал помещать запятую перед элементами!