У меня есть модель Mongoose, которая выглядит так:
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
как во время выполнения (оператор журнала 'elements before save:'), так и при проверке базы данных MongoDB с помощью клиентаmongo
. - Во второй раз второй объект добавляется к
project.screens[screenIndex].elements
во время выполнения, но этот объект никогда не сохраняется в MongoDB. - В третий раз объекты 1 и 3 видны в
project.screens[screenIndex].elements
во время выполнения, но третий объект никогда не сохраняется в MongoDB.
Что вызывает такое поведение?
БОЛЬШОЕ ОБНОВЛЕНИЕ: я переписал весь механизм сохраняемости, чтобы он запускался реже, и вместо этого заменил весь объект 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
в документах? mongoosejs.com/docs/api.html#document_Document-markModified Изменения победили не настаивайте, если Мангуст не знал, что они произошли. - person WiredPrairie   schedule 02.02.2014project.markModified('screens.0');
и дажеproject.markModified('screens');
, но без изменений. - person Tom Söderlund   schedule 02.02.2014markModified
. - person Tom Söderlund   schedule 02.02.2014