Mongoose deleteOne()与deleteMany()无法删除MongoDB数据求助
问题解决:Mongoose删除操作未生效的原因及修复
核心问题
删除操作未生效的本质是**deleteMany()是异步方法,你没有等待它执行完成**。Mongoose的所有数据库操作均为异步,直接调用Item.deleteMany({name: "test"})仅会创建一个Promise,但不会等待该Promise完成,导致实际删除逻辑未被执行。
另外,每次启动服务器时item1.save()都会执行一次,这会导致你每次重启服务都会新增一条test数据。
修复步骤
1. 正确处理异步删除操作
在Express路由中通过async/await或Promise的.then()/.catch()`来确保删除操作执行完成:
方式一:使用async/await
app.get("/", async function(req, res){ console.log("get request received"); try { const result = await Item.deleteMany({name: "test"}); console.log(`删除了${result.deletedCount}条文档`); res.send("删除操作完成"); } catch (err) { console.error(err); res.status(500).send("删除失败"); } });
方式二:使用Promise链式调用
app.get("/", function(req, res){ console.log("get request received"); Item.deleteMany({name: "test"}) .then(result => { console.log(`删除了${result.deletedCount}条文档`); res.send("删除操作完成"); }) .catch(err => { console.error(err); res.status(500).send("删除失败"); }); });
2. 避免重复插入测试数据
修改插入逻辑,仅当数据库中不存在test条目时才执行插入:
// 替换原有的item1.save() Item.countDocuments({name: "test"}).then(count => { if (count === 0) { const item1 = new Item({name: "test"}); item1.save().then(() => console.log("初始化测试数据")); } });
3. 移除过时的Mongoose配置
MongoDB Driver 4.0+版本已不再需要useNewUrlParser: true配置,可简化连接代码:
mongoose.connect("mongodb://localhost:27017/testDB");
修复后的完整代码
const express = require("express"); const bodyParser = require("body-parser"); const mongoose = require("mongoose"); const app = express(); // 简化数据库连接配置 mongoose.connect("mongodb://localhost:27017/testDB"); app.set('view engine', 'ejs'); app.use(bodyParser.urlencoded({extended: true})); app.use(express.static("public")); const itemsSchema = new mongoose.Schema({ name: String }); const Item = mongoose.model("Item", itemsSchema); // 仅在无test数据时插入初始化内容 Item.countDocuments({name: "test"}).then(count => { if (count === 0) { const item1 = new Item({name: "test"}); item1.save().then(() => console.log("初始化测试数据")); } }); // 异步处理删除请求 app.get("/", async function(req, res){ console.log("get request received"); try { const deleteResult = await Item.deleteMany({name: "test"}); console.log(`成功删除${deleteResult.deletedCount}条名称为test的文档`); res.send(`成功删除${deleteResult.deletedCount}条文档`); } catch (error) { console.error("删除失败:", error); res.status(500).send("删除操作失败"); } }); app.listen(3000, function(){ console.log("Server started on port 3000"); });
验证结果
启动服务器后,发送GET请求到http://localhost:3000,终端会输出删除的文档数量,再查询数据库:
testDB> db.items.find() # 此时应返回空数组,所有test文档已被删除
内容的提问来源于stack exchange,提问作者pankrashin
相关产品推荐
相关产品推荐

