MongooseJS如何删除嵌套对象内items数组中指定_id的对象
解决方案
错误原因
报错是因为$pull的语法使用错误:$pull操作符的参数结构为「待操作的数组路径: 元素匹配规则」,你当前写的"content.items._id"是指向数组内部元素的_id属性,而非items数组本身,MongoDB无法基于这个路径遍历数组执行删除操作。
修正后的代码
// 如果items里的_id是ObjectId类型,需要先把前端传的字符串转成ObjectId const productId = mongoose.Types.ObjectId(req.body.productId); // 如果你需要获取更新后的文档,建议用findOneAndUpdate,updateOne的new参数不生效(仅返回更新统计结果) Cart.findOneAndUpdate( { "content.merchantId": req.body.merchantId }, // $pull直接指定数组路径,然后写匹配规则 { $pull: { "content.items": { _id: productId } } }, { new: true }, function (error, result) { if (error) { // 处理错误逻辑 } else if (result) { // 处理成功逻辑,result为更新后的文档 } } );
如果不需要返回更新后的文档,保留updateOne写法即可:
const productId = mongoose.Types.ObjectId(req.body.productId); Cart.updateOne( { "content.merchantId": req.body.merchantId }, { $pull: { "content.items": { _id: productId } } }, function (error, result) { if (error) { } else if (result) { } } );
额外注意点
你当前Schema里items定义为无类型数组items: [],如果后续需要严格校验字段,建议补充items的子Schema定义,避免类型不匹配导致的匹配失败问题。
内容的提问来源于stack exchange,提问作者Koala
相关产品推荐
相关产品推荐

