如何使用Node.js对MongoDB数组内对象字段自增后保存到数据库
问题原因
Mongoose 默认无法自动检测嵌套数组内部对象的属性变更,你直接修改each.quantity后,Mongoose 没有感知到该路径的变更,因此执行save()时不会把这部分修改提交到数据库。
解决方案
方案1:手动标记变更路径(改动最小)
修改完数组属性后,调用markModified()方法手动告知 Mongoose 对应路径发生了变更,再执行save即可生效。
修改后的代码如下:
await user.cart.items.find((each) => { if (JSON.stringify(each._id) === JSON.stringify(productId)) { if (each.instock > each.quantity) { each.quantity += 1; console.log("Incremented"); } } }); console.log(user.cart.items); // 新增代码:标记cart.items路径为已修改 user.markModified('cart.items'); await user.save();
方案2:使用原子操作直接更新(更推荐)
不需要先查询文档实例、修改再保存,直接用 MongoDB 的原子更新操作符完成自增,性能更高,还能避免并发修改导致的数据不一致问题:
await User.findByIdAndUpdate( userId, // 替换为当前操作的用户ID { // 匹配数组中符合条件的元素,对其quantity执行+1操作 $inc: { "cart.items.$[elem].quantity": 1 } }, { arrayFilters: [ { "elem._id": productId, "elem.instock": { $gt: "$$elem.quantity" } } ], new: true // 可选配置:返回更新后的最新文档 } )
内容的提问来源于stack exchange,提问作者Mehdi Faraji
相关产品推荐
相关产品推荐

