mongoose findOneAndUpdate返回更新文档但未修改数据库的解决咨询
解决Mongoose findOneAndUpdate返回更新文档但数据库未修改的问题
我之前也踩过这个坑!你遇到的问题核心原因是Mongoose的**严格模式(strict mode)**默认开启——这个模式会自动过滤掉Schema中未定义的字段,所以你在$set里指定的processed:1根本不会被同步到数据库,只是在返回的内存文档对象上临时添加了这个属性而已。
下面给你两个靠谱的解决方案,根据你的需求选就行:
方案1:在Schema中定义processed字段(推荐长期场景)
如果processed是你业务中需要长期使用的字段,最规范的做法是直接在Schema里添加它:
var mongoose = require('mongoose'); module.exports = mongoose.model('collection', { _id: mongoose.Schema.Types.ObjectId, parm1: {type: String}, parm2: {type: Number}, parm3: {type: String, index:true}, processed: {type: Number, default: 0} // 新增字段,可设置默认值 }, 'mycollection');
这样修改后,Mongoose会允许对这个字段的更新操作,数据库和返回的文档都会同步更新。
方案2:关闭严格模式(适合动态/临时字段场景)
如果processed是临时字段或者你需要动态添加字段,可以选择关闭严格模式,分两种方式:
方式A:全局关闭Schema的严格模式
修改你的Schema定义,在选项中添加strict: false:
var mongoose = require('mongoose'); var schema = new mongoose.Schema({ _id: mongoose.Schema.Types.ObjectId, parm1: {type: String}, parm2: {type: Number}, parm3: {type: String, index:true} }, { strict: false }); // 全局关闭严格模式 module.exports = mongoose.model('collection', schema, 'mycollection');
这样整个Schema下的所有查询都允许更新未定义的字段。
方式B:仅针对当前查询关闭严格模式
如果不想影响全局Schema设置,只需要在本次findOneAndUpdate的选项中添加strict: false即可:
mongoose.model(collection).findOneAndUpdate( {[fieldName]: fieldValue}, {$set:{processed:1}}, {new:true, strict: false}, // 仅本次查询关闭严格模式 function(err, doc){ console.log(doc); callback(err, doc); } );
验证效果
不管用哪种方案,修改后再执行查询,你会发现:
- MongoDB数据库中的目标文档会新增
processed:1字段 - 返回的
doc对象也会正确包含processed:1属性
内容的提问来源于stack exchange,提问作者JoaoFilipeClementeMartins
相关产品推荐
相关产品推荐

