mongoose不会更新子文件

几个小时以来,我一直在抨击我的头,似乎无法解决这个问题。 我决定在一个学习项目上使用Mongo,看看我喜欢它。 mongoose是推荐使用它的方式,所以我也是这样做的。 我有两个模式:

var PluginSchema = new Schema({ name: { type: String, required: true }, slug: { type: String }, description: { type: String }, created_date: { type: Date, default: Date.now }, active: { type: Boolean, default: true }, user: { type: Schema.Types.ObjectId, ref: 'User' }, versions: [PluginVersion.schema] }); PluginSchema.methods.getLatestVersion = function(callback) { if(this.versions.length > 0) { this.versions.sort(function(a, b) { if(semver.gt(a.version, b.version)) { return 1; } else if(semver.lt(a.version, b.version)) { return -1; } else { return 0; } }); callback(this.versions[this.versions.length-1]); } else { callback(undefined); } }; 

 var PluginVersionSchema = new Schema({ version: { type: String, required: true }, downloads: { type: Number, default: 0 }, size: { type: Number, required: true }, updatedChecks: { type: Number, default: 0 }, fileName: { type: String, required: true }, uploadedDate: { type: Date, default: Date.now } }); 

这里的问题是“版本”关系。 在某些时候,我想更新插件的版本。 我想更新的是updatedChecks字段。 基本上只是updatedChecks += 1

 Plugin.findById(req.params.plugin_id) .populate('user') .populate('versions') .exec(function(err, plugin) { if(err) { res.status(404); res.send("Plugin not found."); } else { plugin.getLatestVersion(function(version) { if(version !== undefined) { pluginData = { stuff: "that", gets: "returned", tothe: "user" }; // This says 'Affected: 1'. As expected PluginVersion.update({_id: version._id}, { updatedChecks: version.updatedChecks + 1 }, function(err, affected) { console.log("Affected: " + affected); if(err) { res.send(err); } res.status(200); res.json(pluginData); }); } else { res.status(404); res.send("No versions found for this plugin."); } }); } }); 

到现在为止还挺好。 但是,当我尝试通过插件架构再次访问该版本时, updatedChecks值没有改变! 我检查了我正在更新的版本与从Plugin.versions字段获取的版本的_id值,它们是相同的。 我需要从Plugin.versions删除版本,并重新插入一个新的更新值? 我也尝试只更新值并调用save()但似乎并没有工作。

我最终通过直接从Plugin对象访问插件版本来完成这项工作。

 var pluginIndex = false; for(var i = 0; i < plugin.versions.length; i++) { if(plugin.versions[i]._id === version._id) { pluginIndex = i; } } if(pluginIndex !== false) { plugin.versions[pluginIndex].updatedChecks++; plugin.versions[pluginIndex].markModified('updatedChecks'); plugin.versions[pluginIndex].save(function() { plugin.markModified('versions'); plugin.save(function() { res.status(200); res.json(pluginData); }); }); } 

我也有一点帮助: Mongoose save()不更新数据库文件中的数组中的值

这里的问题是,你的更新查询写错了。 一定是

 PluginVersion.update({ _id: version._id }, { $set: { updatedChecks: version.updatedChecks + 1 } }, function(...) { ... }); 

要么

 PluginVersion.update({ _id: version._id }, { $inc: { updatedChecks: 1 } }, function(...) { ... }); 

你可以在这里find更多的更新操作符: http : //docs.mongodb.org/manual/reference/operator/update/