Mongoose错误:无法同时更新__v和__v

我需要帮助。 我有一个从一开始就工作的节点项目。 最近我开始得到一个关于mongoose不能同时更新__v __v的错误(下面的细节)我的第一个想法是mongoose的一个新的更新带来了这个,但我不知道。 任何帮助将不胜感激。 谢谢

/.../node_modules/mongoose/lib/utils.js:413 throw err; ^ MongoError: exception: Cannot update '__v' and '__v' at the same time at Object.toError (/.../node_modules/mongoose/node_modules/mongodb/lib/mongodb/utils.js:114:11) at /.../node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js:1131:31 at /.../node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js:1846:9 at Server.Base._callHandler (/.../node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/base.js:445:41) at /.../node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js:478:18 at MongoReply.parseBody (/.../node_modules/mongoose/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js:68:5) at null.<anonymous> (/.../node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js:436:20) at EventEmitter.emit (events.js:95:17) at null.<anonymous> (/.../node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:201:13) at EventEmitter.emit (events.js:98:17) 

编辑看起来像是当我试图保存时抛出的错误。 这是我所说的保存方法。

 save: function (callback) { // A Helper function function setID(instance, id) { instance._id = id; }; var self = this; // Preserve reference to the instance var update = Utils.clone(this); delete update._id; // Delete the _id property, otherwise Mongo will return a "Mod on _id not allowed" error // Prepare updates for saving for (var key in update) { if (update[key] == undefined) delete update[key]; if (key == 'company' || key == 'local_currency') update[key] = update[key].getID(); } PreferenceModel.save(this._id, update, function (err, savedDoc) { if (err) callback(err); else { if (!self.getID()) // If the object didn't previously have an _id property setID(self, savedDoc._id); callback(null, self); } }); } 

这里是我所说的

 preference.save(function (err, savedPreference) { if (err) callback(err); else callback(null); }); 

另外,这里是PreferenceModel.save方法;

 function save(id, update, callback) { Preference.findByIdAndUpdate(id, update, {upsert: true}, function (err, savedDoc) { if (err) callback(err); else callback(null, savedDoc); }); } 

我build议你把_id相关的删除逻辑放入你的mongoose模式模式定义文件:

 var UserSchema = new mongoose.Schema(fieldDefinitions); // Ensure virtual fields are serialised. UserSchema.set('toJSON', { virtuals: true }); // Ensure able to see virtual fields output when using console.log(obj) UserSchema.set('toObject', { virtuals: true }); UserSchema.options.toJSON = { transform : function(doc, ret, options) { console.log('--> ' + require('util').inspect( ret._id.id )); ret.id = ret._id.id; delete ret._id; delete ret.__v; return ret; }, virtuals: true }; 

然后在你的callback中执行toJSON:

 var processedJson = resultDoc.toJSON(); 

检索很好地隐藏了可重用逻辑的处理版本。
注意:toJSON()也是通过JSON.stringify()魔法执行的。