Я изо всех сил пытаюсь сохранить массив поддокументов. Просто не сэкономить:Mongoose save subdocument array
Передняя часть отправляет объект «День», который имеет массив заголовков, и каждый заголовок может иметь массив содержимого (который представляет собой схему мангуста).
var DaySchema = mongoose.Schema({
date: Date,
startTime: Date,
endTime: Date,
title: String,
order: Number,
description: String,
cohort: {
type: objId,
ref: 'cohort'
},
instructors: [{
type: objId,
ref: 'instructor'
}],
headings: [{
title: String,
subTitle: String,
content: [{
type:objId,
ref: 'content'
}]
}]
});
var ContentSchema = mongoose.Schema({
title: String,
description: String,
contentUrl: String,
dueDate: Date,
dateAssigned: Date,
downloadUrl: String
});
Это код, который я использую для отправки и отправки по дням со связанными объектами контента. Все работает, кроме сохранения содержимого. Когда я смотрю в оболочке mongo, каждое поле содержимого под заголовками выглядит так:
content: []
Любые мысли?
exports.putdaycontent = function (req, res) {
var dayId = req.params.dayId;
var headings = req.body.headings;
var day = req.body;
var updateDay = function() {
Day.update({_id: dayId}, day, {new: true, upsert: true}, function (err, day) {
if (err)
error.databaseError(req, res, err);
res.send(day);
});
};
if (headings) {
for (var x = 0; x < headings.length; x++) {
var h = headings[x];
if (h.content) {
for (var y = 0; y < h.content.length; y++) {
var c = h.content[y];
//If existing content update it
if (c._id && c._id.length > 0) {
Content.update({_id: c._id}, c, {new: true,upsert: true}, function (err, content) {
});
} else {
var content = new Content(c);
h.content[y] = content;
}
}
}
}
day.headings = headings;
updateDay();
} else {
updateDay();
}
};
exports.postdaycontent = function (req, res) {
var headings = req.body.headings;
var day = req.body;
var cohortId = day.cohort._id;
var postDay = function() {
var d = new Day(day);
console.log("CONTENT DAYS:",d);
d.save(function(err, newDay) {
if (err)
error.databaseError(req, res, err);
Cohort.findOneAndUpdate({_id: cohortId}, {$push: {days: newDay}}, {upsert: true}, function(err, newCohort) {
res.send({msg:"Successfully saved day to cohort"});
});
});
};
if (headings) {
for (var x = 0; x < headings.length; x++) {
var h = headings[x];
if (h.content) {
for (var y = 0; y < h.content.length; y++) {
var c = h.content[y];
var content = new Content(c);
h.content[y] = content;
console.log("CONTENT:",content);
}
}
}
day.headings = headings;
}
postDay();
};
Асинхронные функции и синхронные петли плохо перемешиваются. Вы никогда не должны использовать '.update()' без '$ set' или подобных операторов. Все массивы ссылаются так, если фактические объекты уже существуют в другой коллекции, которые вы не создаете таким образом. Надеемся, что 'objId' был импортирован из' Schema.Types.ObjectId'. Это всего лишь несколько мыслей, которые приходят на ум с первого взгляда. –
Я не уверен, что вы говорите, я должен * делать. Идея заключается в том, что пользователь создает День с X количеством заголовков и X количеством объектов контента в массиве содержимого. Затем они нажимают кнопку «Сохранить», а «back-end» обновляют объекты, которые необходимо обновить, и если они не существуют, она создает их. Я мог бы сохранить каждый объект контента отдельно, но как бы я мог убедиться, что они добавлены в массив в массиве Content внутри дня? – Spentak