MongoDB多级嵌套字段更新求助:批量扣减子文档quantity值
解决MongoDB嵌套数组中quantity扣减的问题
嘿,我来帮你搞定这个更新失败的问题~你的语句有两个关键问题,咱们一步步理清楚:
问题分析
- 路径定位错误:你的文档里
inventory是一个数组,batch也是inventory元素里的数组,不能直接用inventory.inventory_stock_id.batch.quantity这种方式定位,必须用MongoDB的**位置操作符$**来指向匹配到的数组元素。 - 操作符使用错误:你要实现的是扣减数量(从50变成10,即减40),但用了
$set直接赋值为40,这不仅不是扣减逻辑,还因为路径错误导致更新完全不生效。应该用专门做增减操作的$inc操作符。
正确的更新语句
场景1:batch数组只有一个元素(符合你的示例文档)
如果每个inventory项里的batch只有一条数据,用下面的语句就能精准扣减:
db.inventory.update( { "branch_id": "BR5cc825dac42dac3aae49ff91", "inventory.inventory_stock_id": "MED111" }, { $inc: { "inventory.$.batch.$.quantity": -40 } }, { multi: true } )
inventory.$:表示查询条件中匹配到的第一个inventory数组元素(因为你用inventory.inventory_stock_id指定了要找的库存项)batch.$:表示该inventory元素下的第一个batch数组元素$inc: { ...: -40 }:表示把目标quantity值减去40(50-40=10,正好符合你的预期结果)
场景2:batch数组有多个元素,需要精准定位某一个
如果batch里有多条数据,想针对特定批次(比如指定生产日期)扣减,只需在查询条件里加上batch的匹配字段:
db.inventory.update( { "branch_id": "BR5cc825dac42dac3aae49ff91", "inventory.inventory_stock_id": "MED111", "inventory.batch.manuf_date": "10-01-2020" }, { $inc: { "inventory.$.batch.$.quantity": -40 } }, { multi: true } )
这样batch.$就会精准指向匹配到的那个批次,不会影响其他batch数据。
验证结果
执行完上面的语句后,你可以用db.inventory.find({branch_id: "BR5cc825dac42dac3aae49ff91"})查询,就能看到quantity已经变成10啦~
内容的提问来源于stack exchange,提问作者arun kumar
相关产品推荐
相关产品推荐

