NodeJS Mongoose deleteOne()和deleteMany()不工作

2sbarzqh  于 12个月前  发布在  Node.js
关注(0)|答案(1)|浏览(131)

我正在做一个学习项目,创建一个简单的Web应用程序来编写和存储todos,当时我遇到了一个问题,我无法删除MongoDB数据库中的条目.我创建了这个简单的JavaScript应用程序与mongoose模块重现问题.它创建"test"对象与名称"test"并将其存储在数据库.然后它删除所有对象与"test"名称。正如你在屏幕截图上看到的,应用程序成功地创建和存储了对象,但忽略了删除它们,这是我的初始目标
我提前感谢所有人的帮助。
Screenshot describing the problem
我的JavaScript代码:

const express = require("express");
const bodyParser = require("body-parser");
const mongoose = require("mongoose");

const app = express();

mongoose.connect("mongodb://localhost:27017/testDB", {useNewUrlParser: true});

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);

const item1 = new Item({
    name: "test"
});
item1.save();

app.get("/", function(req, res){
    console.log("get request received");
    Item.deleteMany({name: "test"});
});

app.listen(3000, function(){
    console.log("Server started on port 3000");
});

字符串
端子输出:

$ node app.js
(node:2868) [MONGODB DRIVER] Warning: useNewUrlParser is a deprecated option: useNewUrlParser has no effect since Node.js Driver version 4.0.0 and will be removed in the next major version       
(Use `node --trace-warnings ...` to show where the warning was created)
Server started on port 3000
get request received


运行应用程序并发送GET请求后的数据库条目:

testDB> db.items.find()
[
  { _id: ObjectId('658de5a4687d08a6d992f578'), name: 'test', __v: 0 },
  { _id: ObjectId('658de5df82d80828a24ef6ca'), name: 'test', __v: 0 },
  { _id: ObjectId('658de60b1fb7cb4857d913d3'), name: 'test', __v: 0 }
]

**已尝试:**deleteOne()和deleteMany()命令。
**预期发生:**删除数据库中所有名为“test”的元素。
**实际结果:**对象存储在数据库中,但不会删除元素。

a11xaf1n

a11xaf1n1#

mongoose数据库操作需要使用它们的then()函数执行,或者使用async/await执行,这允许它们的行为就像它们返回了一个已解决的promise,因为mongoose queries are not actually promisies。它们也可以使用exec()函数执行,返回一个promise,并将按照这样的方式运行。如果你不使用then()async/await,那么查询将不会执行。
两个例子是:

app.get("/", function(req, res){
    console.log("get request received");
    Item.deleteMany({name: "test"}).then(obj => {
       console.log(obj.deletedCount);
       res.send(`Deleted ${obj.deletedCount} documents`);
    }).catch(err => {
       console.log(err);
       res.send(`Error on server`);
    });
});

字符串

app.get("/", async function(req, res){ //< Mark as async
   console.log("get request received");
   try{
      const obj = await Item.deleteMany({name: "test"});
      res.send(`Deleted ${obj.deletedCount} documents`);
   }catch(err){
      console.log(err);
      res.send(`Error on server`);
   }
});


这些给予你可以采用的两种异步模式,你可以在你的数据库查询中开始,但是当删除记录时,你应该在你的请求中传递一个资源标识符,比如文档的ObjectId,并使用适当的HTTP请求动词,比如app.deleteapp.post

相关问题