使用MongoDB updateOne与$pull删除嵌套数组元素失败求助
问题分析与解决方案
存在的问题
- 语法错误:第一行
const listName = "Holiday;缺少闭合的双引号,会直接导致代码执行报错。 - $pull匹配逻辑错误:你用
new Item({name: "Sleep"})创建了新的Item对象,这个对象会包含MongoDB自动生成的_id,但数据库中名为"Sleep"的item有自己的唯一_id,两者完全不匹配,所以$pull无法定位到要删除的元素。
修正后的代码
const listName = "Holiday"; User.updateOne( { username: req.user.username }, { $pull: { "lists.$[updateList].items": { name: "Sleep" } } }, { arrayFilters: [ { "updateList.name": listName } ] } ).exec().then(function(){ console.log("Deleted successfully"); res.redirect("/list-"+listName); })
说明
- 修复了字符串未闭合的语法问题;
- 直接在
$pull中指定{ name: "Sleep" }作为匹配条件,只要items数组中元素的name字段等于"Sleep"就会被移除,无需创建多余的Item实例; - 保留了原有的arrayFilters逻辑,能正确定位到名为"Holiday"的lists子文档。
内容的提问来源于stack exchange,提问作者Aryan
相关产品推荐
相关产品推荐

