如何用Mongoose定位cart嵌套数组文档以修改或删除
MongoDB中通过product_Id操作cart数组元素(修改qty/删除)
文档结构
{ "_id": "631059faf95beef06e70a2bf", "cart": [ { "product_Id": "62be9f370d6b1ded3097e026", "qty": 1 }, { "product_Id": "62be9f370d6b1ded3097e027", "qty": 1 } ], "username": "lucas@admin.com", "password": "$2b$10$YSQKuxr1tzV7SlSanj2N3eiUMVnO1fiJpvS5ka8g2UYSwFPvgg/I2", "alias": "lucas123", "avatar": "56fdfc0c-d6ca-461f-be85-80eb37144301.jpeg", "admin": true, "__v": 0 }
需求
基于product_Id定位cart数组内的元素,实现两个操作:
- 修改对应元素的
qty值 - 删除对应元素
现有可运行的添加商品代码
addProduct(userId, productToAdd) { return this.db .then((_) => this.model.findOneAndUpdate( { _id: userId }, { $push: { cart: productToAdd } } ) ) .then((resp) => { return resp; }); }
实现方案
1. 修改cart中指定product_Id的qty
利用MongoDB的数组位置操作符$匹配目标元素,结合$set或$inc完成修改:
方式一:直接设置qty为指定值
updateCartItemQty(userId, productId, newQty) { return this.db .then(() => this.model.findOneAndUpdate( { _id: userId, "cart.product_Id": productId }, { $set: { "cart.$.qty": newQty } }, { new: true } // 可选,返回更新后的文档 ) ) .then(updatedDoc => updatedDoc); }
方式二:增量修改qty(如数量加1/减1)
用$inc操作符实现数量增减:
incrementCartItemQty(userId, productId, incrementNum) { return this.db .then(() => this.model.findOneAndUpdate( { _id: userId, "cart.product_Id": productId }, { $inc: { "cart.$.qty": incrementNum } }, { new: true } ) ) .then(updatedDoc => updatedDoc); }
2. 删除cart中指定product_Id的元素
使用$pull操作符移除数组中匹配的元素:
removeCartItem(userId, productId) { return this.db .then(() => this.model.findOneAndUpdate( { _id: userId }, { $pull: { cart: { product_Id: productId } } }, { new: true } ) ) .then(updatedDoc => updatedDoc); }
关键说明
cart.$.qty中的$是MongoDB数组位置操作符,会匹配查询条件中第一个符合cart.product_Id的元素位置{ new: true }选项默认关闭,开启后返回更新后的文档,可根据业务需求选择
内容的提问来源于stack exchange,提问作者AlZ
相关产品推荐
相关产品推荐

