Mongoose自增数值失效求助:count +=2出现字符串拼接而非数值相加
问题根源与解决方案
嘿,这个问题我之前也碰到过,本质是字段类型不匹配搞的鬼!
为什么会出现字符串拼接的情况?
你在Schema里定义count是Number类型,但数据库中实际存储的count字段很可能是字符串类型——这是关键原因:
- 可能是你第一次插入文档时,不小心把
count传成了字符串(比如"2"而不是数字2); - 也可能是手动在MongoDB里修改过字段类型,或者早期Schema没严格约束类型;
- Mongoose默认不会自动转换已存在文档的字段类型,哪怕你后来改了Schema,读出来的还是原来的字符串类型。
当count是字符串时,执行topic.count += 2就变成了字符串拼接:"2" + 2 = "22",多次执行自然就会变成"2222..."。
怎么验证?
你可以打开MongoDB Shell,执行以下命令查看目标文档的字段类型:
db.topics.findOne({ _id: 你的topic文档ID })
如果count的值是带引号的(比如"2"),就说明它确实是字符串类型。
修复方案
先修正现有数据的类型
使用MongoDB的聚合更新命令,把所有count字段从字符串转为数字(MongoDB 4.0+支持):db.topics.updateMany({}, [{$set: {count: {$toInt: "$count"}}}]);确保后续数据的类型正确
- 确认Mongoose的
strict模式开启(默认是true),这样如果传入字符串类型的count,Mongoose会直接报错,而不是偷偷存成字符串; - 可以给Schema的
count字段加上更严格的约束:const TopicSchema = mongoose.Schema({ count: { type: Number, required: true, default: 0 // 确保默认值是数字 } });
- 确认Mongoose的
更可靠的自增方式(推荐)
不要先读取文档再修改赋值,而是用Mongoose的原子更新操作$inc,既保证类型正确,还能避免并发更新的问题:// 找到文档并自增count,返回更新后的文档 Topic.findOneAndUpdate( { _id: topicId }, { $inc: { count: 2 } }, { new: true } // 这个选项让返回的是更新后的文档 ) .then(updatedTopic => { console.log(updatedTopic.count); // 这里会正确返回自增后的数字 })
内容的提问来源于stack exchange,提问作者yong ho
相关产品推荐
相关产品推荐

