Как заполнить вложенные документы Mongoose
Я прочитал и перечитал несколько постов о встроенных и связанных документах в Mongoose. Основываясь на том, что я прочитал, я пришел к выводу, что было бы лучше иметь структуру схемы, подобную следующей:
var CategoriesSchema = new Schema({
year : {type: Number, index: true},
make : {type: String, index: true},
model : {type: String, index: true},
body : {type: String, index: true}
});
var ColorsSchema = new Schema({
name : String,
id : String,
surcharge : Number
});
var MaterialsSchema = new Schema({
name : {type: String, index: true},
surcharge : String,
colors : [ColorsSchema]
});
var StyleSchema = new Schema({
name : {type: String, index: true},
surcharge : String,
materials : [MaterialsSchema]
});
var CatalogSchema = new Schema({
name : {type: String, index: true},
referenceId : ObjectId,
pattern : String,
categories : [CategoriesSchema],
description : String,
specifications : String,
price : String,
cost : String,
pattern : String,
thumbnailPath : String,
primaryImagePath : String,
styles : [StyleSchema]
});
mongoose.connect('mongodb://127.0.0.1:27017/sc');
exports.Catalog = mongoose.model('Catalog', CatalogSchema);
Данные, определенные в CategoriesSchema, ColorsSchema и MaterialsSchema, не будут меняться очень часто, если вообще когда-либо. Я решил, что было бы лучше иметь все данные в модели Каталога, потому что, хотя существует несколько категорий, цветов и материалов, их не будет много, и мне не нужно находить какие-либо из них независимо от Каталога.
Но я полностью запутался в сохранении данных в модель. Вот где я озадачен:
var item = new Catalog;
item.name = "Seat 1003";
item.pattern = "91003";
item.categories.push({year: 1998, make: 'Toyota', model: 'Camry', body: 'sedan' });
item.styles.push({name: 'regular', surcharge: 10.00, materials(?????)});
item.save(function(err){
});
С такой вложенной встроенной схемой, как я могу получить данные во вложенные материалы и цвета?
метод.push(), по-видимому, недоступен для вложенных документов.
1 ответ
Массив встроенных документов имеет push
метод. Просто добавьте встроенные документы после первоначального создания item
:
var item = new Catalog;
item.name = "Seat 1003";
item.pattern = "91003";
item.categories.push({year: 1998, make: 'Toyota', model: 'Camry', body: 'sedan' });
var color = new Color({name: 'color regular', id: '2asdfasdfad', surcharge: 10.00});
var material = new Material({name: 'material regular', surcharge: 10.00});
var style = new Style({name: 'regular', surcharge: 10.00});
тогда вы можете вставить каждый встроенный документ в своих родителей:
material.colors.push(color);
style.materials.push(material);
item.styles.push(style);
Затем вы можете сохранить весь объект базы данных, как вы, где уже делаете:
item.save(function(err){});
Это оно! И у вас есть встроенные массивы документов.
Несколько других заметок о вашем коде, у вас есть pattern
дважды в вашей модели каталога. И чтобы получить доступ к другим типам моделей, вам также необходимо экспортировать их:
exports.Catalog = mongoose.model('Catalog', CatalogSchema);
exports.Color = mongoose.model('Colors', ColorsSchema);
exports.Material = mongoose.model('Materials', MaterialsSchema);
exports.Style = mongoose.model('Style', StyleSchema);