使用Mongoose操作MongoDB时无法删除对象数组中指定元素如何解决
问题根因
你的写法不符合MongoDB $pull 操作符的语法规则:当需要匹配数组内满足多个条件的对象并删除时,不能将数组下的字段直接平铺在$pull的属性下,这种写法会被MongoDB识别为要从数组中拉取三个独立的字段值,而非匹配同时满足三个条件的完整数组对象,因此无法删除目标元素。
修正后的查询语句
两种写法均可以实现需求,根据你的MongoDB版本选择即可:
写法1(兼容所有MongoDB版本,显式声明$elemMatch)
await User.findByIdAndUpdate( currentUser, { $pull: { invitationStatus: { $elemMatch: { ideaId: this.req.body.ideaId, status: "pending", invitedBy: getUserByNotificationId.createdBy._id } } } } )
写法2(MongoDB 3.2+ 简化写法,省略$elemMatch)
await User.findByIdAndUpdate( currentUser, { $pull: { invitationStatus: { ideaId: this.req.body.ideaId, status: "pending", invitedBy: getUserByNotificationId.createdBy._id } } } )
注意事项
- 请核对字段名大小写是否和Schema定义完全一致:你需求中提到的匹配字段是
ideaID(末尾D大写),但代码中使用的是ideaId(末尾d小写),如果Schema中定义为大写D,需要同步修正字段名,否则也会出现匹配失败的问题。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

