Каков правильный шаблон для вложенных схем в 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);
Отказ от ответственности: я бы не стал помещать запятую перед элементами!