MongoDB:为何findOneAndUpdate查询无法按ID删除数据?
问题分析与解决方案
你的问题主要有两个核心原因:
1. ID类型不匹配
MongoDB中的_id字段是ObjectId类型,而你传入的是纯数字字符串,两者直接比对不会相等,导致$pull无法定位到要删除的子项。
2. 模型使用错误
你的Item Schema仅包含name字段,不存在items数组,但你在else分支中用Item模型去查询并更新items字段,自然找不到匹配的文档,所以foundList返回null。
具体修复步骤
第一步:创建正确的List模型
你需要定义一个包含items数组的List模型,用来存储自定义列表及其子项:
import mongoose from "mongoose"; import { itemSchema } from "./item.js"; const listSchema = new mongoose.Schema({ name: String, items: [itemSchema] // 关联子项的Schema }); const List = mongoose.model("List", listSchema); export { List };
第二步:转换字符串ID为ObjectId
使用mongoose.Types.ObjectId将传入的字符串ID转换为MongoDB能识别的ObjectId类型,确保查询匹配。
第三步:修正删除接口代码
替换错误的模型,添加ID转换和错误捕获:
app.post("/delete", function (req, res) { const checkedItemId = req.body.checkbox; const listName = req.body.listName; const ObjectId = mongoose.Types.ObjectId; // 校验ID有效性 if (!ObjectId.isValid(checkedItemId)) { console.log("无效的ObjectId格式"); return res.redirect(listName === "Today" ? "/" : "/" + listName); } if (listName === "Today") { Item.deleteOne({ _id: ObjectId(checkedItemId) }) .then(() => console.log("选中项删除成功!")) .catch(err => console.log("删除失败:", err)); res.redirect("/"); } else { // 移除未定义的console.log(id) List.findOneAndUpdate( { name: listName }, { $pull: { items: { _id: ObjectId(checkedItemId) } } } ) .then(foundList => { if (!foundList) { console.log("未找到匹配的列表"); } else { console.log("从列表中移除项成功!"); } res.redirect("/" + listName); }) .catch(err => { console.log("更新失败:", err); res.redirect("/" + listName); }); } });
内容的提问来源于stack exchange,提问作者Buraxta
相关产品推荐
相关产品推荐

