MongoDB-Node中数组对象属性值自增失败问题求助
解决MongoDB数组元素属性自增失效的问题
嘿,我一眼就揪出你代码里的问题啦!你的更新语句犯了一个常见的操作符嵌套错误——把$inc放在了$set里面,这俩都是MongoDB的顶级更新操作符,可不能互相嵌套使用哦。
错误原因分析
你原来的语句:
db().collection('polls').update( { _id: id, "options.key": item }, {$set: { $inc: { "options.$.votes" : 1 } }} )
$set的作用是直接设置字段值,而$inc是专门用于数值型字段自增/自减的操作符,它需要作为更新对象的顶级键存在,不能被$set包裹。
正确的写法
把$inc直接提出来作为更新文档的顶级属性就可以了:
db().collection('polls').update( { _id: id, "options.key": item }, { $inc: { "options.$.votes": 1 } } )
这里的$占位符非常关键,它会自动匹配查询条件中第一个符合"options.key": item的数组元素,然后精准对该元素的votes字段执行自增1的操作。
额外优化建议
如果你使用的是MongoDB 3.2及以上版本,更推荐使用updateOne方法代替update:
db().collection('polls').updateOne( { _id: id, "options.key": item }, { $inc: { "options.$.votes": 1 } } )
updateOne会明确只更新匹配到的第一个文档,而update默认是多文档更新(除非手动指定{ multi: false }),用updateOne能避免意外修改多个文档的风险。
另外还要注意:确保id变量的类型和文档中_id的类型一致——如果你的_id是ObjectId类型,不要把它当成字符串传入,否则会匹配不到文档哦。
内容的提问来源于stack exchange,提问作者JEEZSUSCRIZE
相关产品推荐
相关产品推荐

