MongoDB中数组内qty字段$inc操作失效问题求助
解决MongoDB数组字段$inc操作失效的问题
我来帮你拆解下你的更新查询失效的核心原因,再给出对应场景的解决方案:
问题根源分析
你的原查询存在两个关键错误:
- 查询条件的字符串未加引号:
{item:IJK2}里的IJK2没有被引号包裹,MongoDB会把它当作一个变量而非字符串字面量。如果这个变量不存在,查询条件就匹配不到任何文档,自然不会执行更新。 - 数组更新语法不符合需求:直接写
stock.qty的话,MongoDB默认只会更新数组中的第一个元素的qty字段,而非所有数组元素,这和你想要的批量更新效果不符,看起来就像“操作失效”。
针对不同需求的正确写法
根据你的实际需求,分两种场景给出正确的更新语句:
场景1:给stock数组中所有元素的qty字段增量10
需要使用MongoDB的数组更新操作符$[],它代表数组中的所有元素:
db.inventory.update( { item: "IJK2" }, // 注意给"IJK2"添加引号 { $inc: { "stock.$[].qty": 10 } } )
执行后你的目标文档会变为:
{ item: "IJK2", details: { model: "14Q2", manufacturer: "M5 Corporation" }, stock: [ { size: "S", qty: 15 }, { size: "L", qty: 11 } ], category: "houseware" }
场景2:只给stock数组中特定size的元素(比如size为"S")的qty增量10
需要使用过滤数组位置操作符$[<identifier>],配合arrayFilters指定过滤条件:
db.inventory.update( { item: "IJK2" }, { $inc: { "stock.$[elem].qty": 10 } }, { arrayFilters: [ { "elem.size": "S" } ] } )
执行后仅size为"S"的元素qty会变为15,size为"L"的qty保持1不变。
内容的提问来源于stack exchange,提问作者Gaurav verma
相关产品推荐
相关产品推荐

