如何使用 Node.js Mongoose 删除文档?

FBFriendModel.find({
id: 333
}, function (err, docs) {
docs.remove(); //Remove all the documents that match!
});

上面的看起来不管用,记录还在那里。

有人能修好吗?

529698 次浏览

docs是一个文档数组。所以它没有mongooseModel.remove()方法。

可以分别迭代和删除数组中的每个文档。

或者——因为看起来你是通过一个(可能)唯一的id来查找文档——使用findOne而不是find

概括来说,你可以使用:

SomeModel.find( $where, function(err,docs){
if (err) return console.log(err);
if (!docs || !Array.isArray(docs) || docs.length === 0)
return console.log('no docs found');
docs.forEach( function (doc) {
doc.remove();
});
});

实现这一目标的另一种方法是:

SomeModel.collection.remove( function (err) {
if (err) throw err;
// collection is now empty but not deleted
});

如果你不喜欢迭代,那就试试

FBFriendModel.find({ id:333 }).remove( callback );

FBFriendModel.find({ id:333 }).remove().exec();

mongoose.model.find返回一个查询,它有一个remove函数

更新为Mongoose v5.5.3 - remove()现在已弃用。使用deleteOne()deleteMany()findOneAndDelete() instead.

更新:猫鼬版本(5.5.3)

remove()已弃用,可以使用deleteOne()、deleteMany()或bulkWrite()代替。

对于"mongoose": ">=2.7.1",你可以直接使用.remove()方法删除文档,而不是找到文档,然后删除它,这对我来说似乎更有效,更容易维护。

看到的例子:

Model.remove({ _id: req.body.id }, function(err) {
if (!err) {
message.type = 'notification!';
}
else {
message.type = 'error';
}
});

更新:

对于mongoose 3.8.1,有几个方法可以让你直接删除一个文档,比如:

  • remove
  • findByIdAndRemove
  • findOneAndRemove

更多信息请参考mongoose API文档

简单的做

FBFriendModel.remove().exec();

mongoose.model.find()返回一个查询对象,它也有一个remove()函数。

如果你只想删除一个唯一的文档,你也可以使用mongoose.model.findOne()

否则,您也可以遵循传统的方法,即首先检索文档,然后删除。

yourModelObj.findById(id, function (err, doc) {
if (err) {
// handle error
}


doc.remove(callback); //Removes the document
})

以下是在model对象上的方法,您可以执行以下任何操作来删除文档:

yourModelObj.findOneAndRemove(conditions, options, callback)

yourModelObj.findByIdAndRemove(id, options, callback)

yourModelObj.remove(conditions, callback);

var query = Comment.remove({ _id: id });
query.exec();
model.remove({title:'danish'}, function(err){
if(err) throw err;
});

裁判:http://mongoosejs.com/docs/api.html#model_Model.remove

小心findOne和删除!

  User.findOne({name: 'Alice'}).remove().exec();

上面的代码删除所有用户命名为'Alice'而不仅仅是第一个

顺便说一下,我更喜欢这样删除文档:

  User.remove({...}).exec();

或者提供一个回调函数并省略exec()

  User.remove({...}, callback);

.remove()的工作原理类似于.find():

MyModel.remove({search: criteria}, function() {
// removed.
});

这对我来说是3.8.1版本最好的:

MyModel.findOneAndRemove({field: 'newValue'}, function(err){...});

并且只需要一个DB调用。 如果在搜索和删除之前不执行任何remove操作,则使用此方法

你可以直接在remove函数中使用查询,这样:

FBFriendModel.remove({ id: 333}, function(err){});

我更喜欢承诺符号,在这里你需要。

Model.findOneAndRemove({_id:id})
.then( doc => .... )

如果只寻找一个要删除的对象,则可以使用

Person.findOne({_id: req.params.id}, function (error, person){
console.log("This object will get deleted " + person);
person.remove();


});

在本例中,Mongoose将根据匹配的req.params.id进行删除。

你可以随时使用Mongoose内置函数:

var id = req.params.friendId; //here you pass the id
FBFriendModel
.findByIdAndRemove(id)
.exec()
.then(function(doc) {
return doc;
}).catch(function(error) {
throw error;
});

更新:.remove()是贬值的,但这仍然适用于旧版本

YourSchema.remove({
foo: req.params.foo
}, function(err, _) {
if (err) return res.send(err)
res.json({
message: `deleted ${ req.params.foo }`
})
});

对于删除文档,我更喜欢使用Model.remove(conditions, [callback])

请参考API文件删除:-

http://mongoosejs.com/docs/api.html#model_Model.remove

对于这种情况,代码将是:-

FBFriendModel.remove({ id : 333 }, function(err, callback){
console.log(‘Do Stuff’);
})

如果你想在不等待MongoDB响应的情况下删除文档,不传递回调,那么你需要对返回的查询调用exec

var removeQuery = FBFriendModel.remove({id : 333 });
removeQuery.exec();

使用remove()方法,您可以删除。

getLogout(data){
return this.sessionModel
.remove({session_id: data.sid})
.exec()
.then(data =>{
return "signup successfully"
})
}

这招对我很管用,试试这个:

const id = req.params.id;
YourSchema
.remove({_id: id})
.exec()
.then(result => {
res.status(200).json({
message: 'deleted',
request: {
type: 'POST',
url: 'http://localhost:3000/yourroutes/'
}
})
})
.catch(err => {
res.status(500).json({
error: err
})
});

remove()已弃用。使用deleteOne()deleteMany()bulkWrite()

我使用的代码

TeleBot.deleteMany({chatID: chatID}, function (err, _) {
if (err) {
return console.log(err);
}
});
db.collection.remove(<query>,
{
justOne: <boolean>,
writeConcern: <document>
})

根据Samyak Jain的回答,我使用异步等待

let isDelete = await MODEL_NAME.deleteMany({_id:'YOUR_ID', name:'YOUR_NAME'});

我真的很喜欢异步/等待能力 Express/Mongoose应用程序中的这种模式:

app.delete('/:idToDelete', asyncHandler(async (req, res) => {
const deletedItem = await YourModel
.findByIdAndDelete(req.params.idToDelete) // This method is the nice method for deleting
.catch(err => res.status(400).send(err.message))


res.status(200).send(deletedItem)
}))

要删除单个文档,您可以使用deleteOne()或remove()与single:true和deleteMany()或remove()删除多个文档:-

  1. 使用deleteOne ()
    syntax
Model.deleteOne({conditions},function(err){});


Example
Model.deleteOne({title:"hi"},function(err){
if(err)
{
res.send(err);
}
else{
res.send("deleted");
}
});

2.使用remove ()

    syntax
Model.remove({conditions},{single:true},function(err){});


Example
Model.remove({title:"hi"},{single:true},function(err){
if(err)
{
res.send(err);
}
else{
res.send("deleted");
}
});

3.使用deleteMany ()

syntax
Model.deleteMany({conditions},function(err){});


Example
Model.deleteMany({title:"hi"},function(err){
if(err)
{
res.send(err);
}
else{
res.send("deleted");
}
});
  1. 使用remove ()
 syntax
Model.remove({conditions},function(err){});


Example
Model.remove({title:"hi"},function(err){
if(err)
{
res.send(err);
}
else{
res.send("deleted");
}
});

如果你知道文档的_id,你可以使用findByIdAndDelete(id),这是findOneAndDelete({ _id: id })的简写。

import Question from '../models/Question';


const deleteQuestion = (questionId: string) => {
try {
Question.findByIdAndDelete(questionId);
} catch (e) {
console.error(e);
}
};

这里questionId是documententid (_id)