У меня проблемы с тем, как вставить несколько вложенных схем в MongoDB с помощью Mongoose и node.js.
Пример ниже немного надуманный, но, надеюсь, объяснит мою проблему. Что касается того, почему каждая схема определена как полная модель, но не используется в примере, то это просто потому, что в моей реальной проблеме они являются фактическими, используемыми моделями, и я хотел, чтобы этот пример был реалистичным на случай, если он будет уместен.
Итак, вот определения схем примера в обратном порядке, т.е. сначала самая маленькая русская кукла:
// Define pen model
var PenSchema = new Schema({
color: String // black, blue or red
});
var Pen = mongoose.model('Pen', PenSchema);
// Define ruler model
var RulerSchema = new Schema({
units: String // inches or millimetres
});
var Ruler = mongoose.model('Ruler', RulerSchema);
// --------
// Define drawing tools model
var DrawingToolsSchema = new Schema({
label: String,
pens: [Pen]
});
var DrawingTools = mongoose.model('DrawingTools', DrawingToolsSchema);
// Define measuring tools model
var MeasuringToolsSchema = new Schema({
label: String,
ruler: [Ruler]
});
var MeasuringTools = mongoose.model('MeasuringTools', MeasuringToolsSchema);
// --------
// Define stationery box model
// It has a label and two compartments - tools for drawing and measuring
var StationeryBoxSchema = new Schema({
label: String,
drawingTools: [DrawingToolsSchema],
measuringTools: [MeasuringToolsSchema]
});
var StationeryBox = mongoose.model('StationeryBox', StationeryBoxSchema);
Надеюсь, вы можете понять, что есть главная модель, StationeryBox, которая имеет ярлык и содержит два отделения для DrawingTools и MeasuringTools, которые являются вложенными схемами. Они в свою очередь имеют свои собственные ярлыки и содержат вложенные схемы для ручек и линеек. Проблема, с которой я сталкиваюсь, заключается во вставке второго уровня вложенности, т.е. ручек/линеек. Итак, исходя из документации mongoose, создание модели верхнего уровня и вставка первых вложенных объектов работает нормально, но затем возникают проблемы. Например:
// To create my stationery box - this works
var stationery = new StationeryBox({ label: 'My Stationery Box' });
// To add the nested compartments - this works
stationery.drawingTools.push({ label: 'My Pens' });
stationery.measuringTools.push({ label: 'My Rulers' });
// But this is wrong as 'stationery.drawingTools.pens' is undefined
stationery.drawingTools.pens.push({ color: 'red' });
stationery.drawingTools.pens.push({ color: 'black' });
А если я вернусь на шаг назад и попытаюсь вставить ручки одновременно с инструментами рисования:
// Also wrong - presumably the second level of nesting is the problem
stationery.drawingTools.push({
label: 'My Pens',
pens: [ // These object represent second levels of nested schema
{ color: 'red' },
{ color: 'black' }
]
});
Я знаю, что это не суперреалистичный пример, но это упрощенный пример реальной системы, которую я создаю, и это был самый простой способ проиллюстрировать это.
Конечно, реальное сохранение происходит после этого, и я оставил это без внимания, но нужно ли мне добавить эти следующие уровни в обратный вызов сохранения?
Если кто-нибудь может сказать мне, где я ошибаюсь, или указать мне правильное направление, я угощу вас хорошим тортом (боюсь, только воображаемым, если вы не живете рядом со мной).