Mongoose $inc(自增)对Schema中部分字段失效问题
Mongoose $inc自增仅对Schema中部分字段生效的问题解决
我在使用Mongoose操作MongoDB时遇到一个问题:Collectibles Schema里,masks字段之前的所有数值型字段(如candles、skulls)能通过$inc正常自增,但masks之后的字段(如witchhat、witchbroom)执行自增操作完全无效。我的自增代码如下,且userId为唯一标识,可精准匹配目标文档。
我的Schema代码:
const { model, Schema } = require('mongoose'); module.exports = model( 'Collectibles', new Schema({ userId: String, guildId: String, candles: Number, skulls: Number, daggers: Number, spiders: Number, masks: Number, witchhat: Number, witchbroom: Number, witchcrystal: Number, groovyghost: Number, groovymic: Number, groovyspeakers: Number, vampirefangs: Number, vampirebat: Number, vampirecape: Number, zombieblood: Number, zombieteeth: Number, zombieeye: Number, grimskull: Number, grimscythe: Number, grimhood: Number, commonpack: Boolean, witchpack: Boolean, groovypack: Boolean, vampirepack: Boolean, zombiepack: Boolean, grimpack: Boolean, }) );
自增操作代码:
await Collectibles.updateOne( { userId: i.user.id }, { $inc: { witchhat: 1 } } )
排查与解决步骤:
重启服务加载更新后的Schema:
如果是在已有文档存入数据库后才添加的masks之后的字段,必须重启Node.js应用——Mongoose默认开启strict: true模式,若未重新加载Schema,新字段会被视为未定义字段,更新操作会被静默忽略。检查目标文档的字段结构:
用MongoDB Shell或Compass查看目标userId对应的文档,确认是否包含witchhat等字段。正常情况下$inc会自动创建不存在的字段并设初始值为1,但如果Schema未加载新字段,这个创建操作会被阻止。临时关闭strict模式测试:
可以在Schema配置中临时添加strict: false(不推荐长期使用,会降低数据一致性)验证问题:new Schema({ // 原有字段... witchhat: Number, // 其他新字段... }, { strict: false })若测试后能正常更新,说明问题确实出在Schema未正确加载或字段未被识别。
捕获更新操作的错误信息:
给自增代码加上try/catch,排查是否有隐藏错误:try { await Collectibles.updateOne( { userId: i.user.id }, { $inc: { witchhat: 1 } } ); } catch (err) { console.error('自增操作失败:', err); }
内容的提问来源于stack exchange,提问作者ASTREX
相关产品推荐
相关产品推荐

