Mongoose中findOneAndReplace的strict选项失效问题求助
解决Mongoose findOneAndReplace无法保存Schema外字段的问题
问题核心在于findOneAndReplace和findOneAndUpdate的执行逻辑差异:
findOneAndUpdate做的是增量更新,传入的strict: false直接作用于更新操作,能顺利写入Schema外的字段。findOneAndReplace是用新对象替换整个文档,它会先把传入的对象转换成Mongoose文档实例,这个转换过程优先遵循Schema本身的strict规则(默认true),哪怕你在方法参数里加了strict: false,转换步骤已经把额外字段过滤掉了,自然存不进数据库。
给你两个可行的解决办法:
方法一:创建替换文档时禁用strict
生成替换用的文档实例时,显式设置strict: false,让Mongoose保留Schema外的字段:
// 假设你的Model是User,请求体为req.body const replacementDoc = new User(req.body, { strict: false }); const result = await User.findOneAndReplace( { _id: userId }, replacementDoc, { new: true, strict: false } );
方法二:用overrideSchemaStrict强制覆盖Schema规则
在findOneAndReplace的选项里添加overrideSchemaStrict: true,强制忽略Schema的strict配置,直接保留所有字段:
const result = await User.findOneAndReplace( { _id: userId }, req.body, { new: true, strict: false, overrideSchemaStrict: true // 关键:覆盖Schema的strict默认设置 } );
测试这两种方法,都能让PUT请求成功保存Schema定义外的额外字段。
内容的提问来源于stack exchange,提问作者John Pham
相关产品推荐
相关产品推荐

