У меня есть модель Мангуст, которая выглядит следующим образом:Только первый суб-документ добавлен к модели MongoDB
var ProjectSchema = new Schema({
name: String,
slug: String,
dateCreated: { type: Date, default: new Date() },
dateUpdated: { type: Date, default: new Date() },
createdByUserId: Schema.Types.ObjectId,
screens: [Schema.Types.Mixed]
});
У меня есть метод класса, который выглядит следующим образом:
ProjectSchema.statics.saveElementProperties = function(slugName, screenIndex, elementId, props, callback) {
var Project = mongoose.model('Project');
var updateProject = function(project) {
// Init empty objects if missing
project.screens[screenIndex] = project.screens[screenIndex] || {};
project.screens[screenIndex].elements = project.screens[screenIndex].elements || {};
project.screens[screenIndex].elements[elementId] = project.screens[screenIndex].elements[elementId] || {};
// Apply properties
project.screens[screenIndex].elements[elementId] = "Dummy Project Data";
console.log('elements before save:', project.screens[screenIndex].elements);
project.save(callback);
};
Project.findOne({ slug: slugName }, function(err, project) {
if (!project) {
project = new Project({ name: slugName, slug: slugName });
}
updateProject(project);
});
};
Это происходит, когда Я называю метод saveElementProperties
:
- В первый раз, когда я запускаю этот метод, он работает так, как должен; новый объект добавляется к
project.screens[screenIndex].elements
как во время выполнения (элементы 'перед сохранением:' оператор журнала), так и при проверке базы данных MongoDB с клиентомmongo
. - Во второй раз второй объект добавляется к
project.screens[screenIndex].elements
во время выполнения, но этот объект никогда не сохраняется в MongoDB. - В третий раз объекты 1 и 3 видны в
project.screens[screenIndex].elements
во время выполнения, но третий объект никогда не сохраняется в MongoDB.
В чем причина этого поведения?
MAJOR UPDATE: Я переписал весь механизм персистенции работать менее часто, и вместо того, чтобы заменить весь project.screens[screenIndex].elements
объект с обновленной структурой:
ProjectSchema.statics.saveScreenProperties = function(slugName, screenIndex, elements, callback) {
console.log('saveScreenProperties:', slugName, screenIndex);
var Project = mongoose.model('Project');
var updateProject = function(project) {
// Init empty objects if missing
project.screens[screenIndex] = project.screens[screenIndex] || {};
project.screens[screenIndex].elements = elements;
// Mark as modified and save
project.markModified('screens.' + screenIndex);
project.save(callback);
};
Project.findOne({ slug: slugName }, function(err, project) {
if (!project) {
project = new Project({ name: slugName, slug: slugName });
console.log(' creating new project');
}
updateProject(project);
});
};
Тем не менее, по-прежнему показывает такое же поведение - это магазины начальный объект elements
, но не позднее его изменения.
Вы смотрели на 'markModified' на документах? http://mongoosejs.com/docs/api.html#document_Document-markModified Изменения не будут сохраняться, если Mongoose не знал, что они произошли. – WiredPrairie
@WiredPrairie Спасибо, я попробовал с добавлением 'project.markModified ('screens.0');' и даже 'project.markModified ('screens');', но без изменений. –
@WiredPrairie: см. Обновление вопроса, включая мое использование 'markModified'. –