我有一个看起来像这样的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
客户端检查MongoDB数据库时,mongo
添加了一个新对象。project.screens[screenIndex].elements
,但此对象永远不会持久保存到MongoDB。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
对象,但后来没有更改它。
答案 0 :(得分:0)
问题是你正在操纵对象,就像在标准代码中一样,但是mongoose不是'持久性引擎'它是ODM。因此,您需要使用提供的方法来更新数据存储区。
您需要使用更新运算符 $ push 到阵列上。猫鼬也有一些类似的方法。最多的解释性文档在MongoDB网站上。
http://docs.mongodb.org/manual/reference/operator/update-array/
http://docs.mongodb.org/manual/reference/operator/update/
http://docs.mongodb.org/manual/reference/method/db.collection.update/#db.collection.update