Node.js Mongoose:如何更新购物车数组中指定商品的数量?
问题描述
我的Cart Schema文档示例如下:
{ _id: 1, line_items: [ { item_id: 101, color: 'white', quantity: 1 }, { item_id: 101, color: 'green', quantity: 1 }, { item_id: 102, color: 'white', quantity: 1 }, ] }
我希望将item_id = 101且color = 'white'的商品数量增加任意数值x,该如何实现?
已尝试的代码及问题
我尝试了以下代码:
await Cart.findById(1).then(doc => { const i = doc.line_items.findIndex(elm => { return (elm.item == item && elm.color == color) // item为变量101,color为变量'white' }); doc.line_items[i].quantity += quantity; doc.save(); }).catch(err => { throw err; });
但代码无法将数量变更保存到数据库,尽管在代码内console.log能看到更新。我还认为可以用单个findByIdAndUpdate函数实现,却不知如何操作。
解决方案
一、修复原有代码
你的代码存在两个关键问题导致保存失败:
- 字段匹配错误:Schema里的字段是
item_id,但代码里用了elm.item,字段名不匹配; - 异步操作未等待:
doc.save()是异步方法,需要用await等待执行完成,否则流程会直接跳过保存步骤。
修复后的代码:
try { const doc = await Cart.findById(1); const targetIndex = doc.line_items.findIndex(elm => elm.item_id === 101 && elm.color === 'white'); if (targetIndex !== -1) { doc.line_items[targetIndex].quantity += x; // x为你要增加的数值 await doc.save(); } } catch (err) { throw err; }
新增targetIndex !== -1的判断,避免找不到目标项时出现数组越界错误。
二、使用findByIdAndUpdate实现(推荐)
利用MongoDB的数组更新操作符,可以一步完成数据库更新,无需先查询再保存,效率更高:
await Cart.findByIdAndUpdate( 1, { $inc: { 'line_items.$.quantity': x } }, { new: true, // 配置后返回更新后的文档,默认返回更新前的 arrayFilters: [ { 'elem.item_id': 101, 'elem.color': 'white' } ] } );
arrayFilters用来精准匹配数组中符合条件的元素;$是定位符,会指向数组中第一个匹配arrayFilters条件的元素;- 如果需要批量更新所有符合条件的数组项,可将
$替换为$[],同时确保arrayFilters的条件正确匹配目标元素。
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

