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

The above doesn't seem to work. The records are still there.

Can someone fix?

0

24 Answers 24

557

If you don't feel like iterating, try

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

or

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

mongoose.model.find returns a Query, which has a remove function.

Update for Mongoose v5.5.3 - remove() is now deprecated. Use deleteOne(), deleteMany() or findOneAndDelete() instead.

12
  • 4
    Does this run pre/post-remove middleware? (some model methods bypass document middleware and I'm not sure if this is one of them, the docs are unclear) Commented Aug 5, 2013 at 2:25
  • 14
    I suppose @hunterloftis has figured this out already, but for anyone else reading the answer is no, this will not run pre/post middleware on individual docs. Commented Nov 4, 2013 at 22:26
  • This seems many of the other answers mention .exec() however this doesn't at all. Is .exec() needed, are there side effects to using it or not?
    – DanH
    Commented Feb 2, 2014 at 13:52
  • The docs are clear (maybe they've been updated) that this bypasses middleware - see the bottom of mongoosejs.com/docs/middleware.html - so be careful, using this method can cause serious, hard to track down issues.
    – Jed Watson
    Commented May 13, 2014 at 7:25
  • 1
    great answer! what are the arguments of the callback?
    – k88074
    Commented Jan 17, 2015 at 19:47
319

UPDATE: Mongoose version (5.5.3)

remove() is deprecated and you can use deleteOne(), deleteMany(), or bulkWrite() instead.

As of "mongoose": ">=2.7.1" you can remove the document directly with the .remove() method rather than finding the document and then removing it which seems to me more efficient and easy to maintain.

See example:

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

UPDATE:

As of mongoose 3.8.1, there are several methods that lets you remove directly a document, say:

  • remove
  • findByIdAndRemove
  • findOneAndRemove

Refer to mongoose API docs for further information.

4
  • 14
    As noted in other comments to other answers, this bypasses middleware that is defined on the schema, and can be really dangerous. So only use it if you understand the impact that will have. For more info, see mongoosejs.com/docs/middleware.html
    – Jed Watson
    Commented May 13, 2014 at 7:28
  • 2
    Just for the record, until now I always have used them without any side effects, sure, I hadn't to use any middleware in my projects :)
    – Diosney
    Commented May 14, 2014 at 11:56
  • 9
    remove(query) could potentially empty your entire collection if you accidentally pass query = {}. For that reason I prefer findOneAndRemove(query) if I am only removing one document. Commented Sep 14, 2016 at 4:14
  • 1
    Also note that this is not returning a query, so neither a promise. You can't do Model.remove({ _id: 'whatever' }).exec().then(...)
    – David
    Commented Sep 20, 2016 at 15:01
55

docs is an array of documents. so it doesn't have a mongooseModel.remove() method.

You can iterate and remove each document in the array separately.

Or - since it looks like you are finding the documents by a (probably) unique id - use findOne instead of find.

2
  • 7
    Seeing as this answer assumes a rather old version of mongoose, I really wouldn't object to someone changing the accepted answer.
    – mtkopone
    Commented May 12, 2014 at 12:01
  • This is actually one of the best ways to do it because it correctly invokes middleware defined on the schema - see mongoosejs.com/docs/middleware.html. You should only use the other methods if you're NOT using middleware in your application, and then with caution.
    – Jed Watson
    Commented May 13, 2014 at 7:26
50

This for me is the best as of version 3.8.1:

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

And it requires only one DB call. Use this given that you don't perform any remove actions pior to the search and removal.

1
  • 1
    As long as you don't need to perform pre 'remove' actions it works fine.
    – Daniel
    Commented Dec 14, 2014 at 12:36
47

remove() has been deprecated. Use deleteOne(), deleteMany() or bulkWrite().

The code I use

TeleBot.deleteMany({chatID: chatID}, function (err, _) {
                if (err) {
                    return console.log(err);
                }
            });
1
  • 7
    This answer honestly needs more upvotes. It's unfairly placed at the bottom of the barrel (because it hasn't been getting a half-decade of antiquated votes), but is the only answer that solves the issue of: (node:9132) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead. Commented Feb 28, 2019 at 7:47
31

Simply do

FBFriendModel.remove().exec();
3
  • 1
    Does this return a Promise? If so, what object is defined when the Promise is resolved? Commented Feb 10, 2016 at 15:45
  • @KennyWorden an effective approach to find the answer -> mongoosejs.com/docs/api.html then search for what you want but prepend '#' to the in-page search with your browser such as search on '#save' and you'll see it returns a promise. Commented Jun 6, 2016 at 0:02
  • 4
    This is kind of a dangerous answer without putting the condition the op specified in the remove...
    – blak3r
    Commented Aug 8, 2016 at 1:48
30

mongoose.model.find() returns a Query Object which also has a remove() function.

You can use mongoose.model.findOne() as well, if you want to remove only one unique document.

Else you can follow traditional approach as well where you first retrieving the document and then remove.

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

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

Following are the ways on model object you can do any of the following to remove document(s):

yourModelObj.findOneAndRemove(conditions, options, callback)

yourModelObj.findByIdAndRemove(id, options, callback)

yourModelObj.remove(conditions, callback);

var query = Comment.remove({ _id: id });
query.exec();
21

To generalize you can use:

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

Another way to achieve this is:

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

Be careful with findOne and remove!

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

The code above removes ALL users named 'Alice' instead of the first one only.

By the way, I prefer to remove documents like this:

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

Or provide a callback and omit the exec()

  User.remove({...}, callback);
15
model.remove({title:'danish'}, function(err){
    if(err) throw err;
});

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

14

If you are looking for only one object to be removed, you can use

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

    });

In this example, Mongoose will delete based on matching req.params.id.

1
  • Welcome to Stackoverflow. Your answer is a duplicate of multiple answers in this thread. Also, you should always check for error in your callbacks. Commented Apr 2, 2016 at 18:36
9

.remove() works like .find():

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

I prefer the promise notation, where you need e.g.

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

For removing document, I prefer using Model.remove(conditions, [callback])

Please refer API documentation for remove :-

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

For this case, code will be:-

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

If you want to remove documents without waiting for a response from MongoDB, do not pass a callback, then you need to call exec on the returned Query

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

You can just use the query directly within the remove function, so:

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

You can always use Mongoose built-in function:

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

Update: .remove() is depreciated but this still works for older versions

YourSchema.remove({
    foo: req.params.foo
}, function(err, _) {
    if (err) return res.send(err)
    res.json({
        message: `deleted ${ req.params.foo }`
    })
});
1
  • Model.remove is deprecated Commented Mar 29, 2019 at 12:24
4

I really like this pattern in async/await capable Express/Mongoose apps:

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)
}))
2

using remove() method you can able to remove.

getLogout(data){
        return this.sessionModel
        .remove({session_id: data.sid})
        .exec()
        .then(data =>{
            return "signup successfully"
        })
    }
2
  • Model.remove is deprecated Commented Mar 29, 2019 at 12:24
  • 1
    Maxwell s.c, make an edit request then, and correct. I know you're new to SO, but it's way more helpful to fix it than to comment that it's depreciated. Maybe you could suggest an edit next time, or make an edit yourself, and take a little ownership of the situation... Commented Mar 29, 2019 at 16:10
2

As per Samyak Jain's Answer, i use Async Await

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

This worked for me, just try this:

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
        })
      });
1
  • Model.remove is deprecated Commented Mar 29, 2019 at 12:24
1

To delete a single document you can use deleteOne() or remove()with single:true and deleteMany() or remove() to delete multiple documents :-

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

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

2.Using 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.using deleteMany()

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

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

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

if you know _id of the document you can use findByIdAndDelete(id) and this is is a shorthand for findOneAndDelete({ _id: id }).

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

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

here questionId is documentId (_id)

-2
db.collection.remove(<query>,
 {
  justOne: <boolean>,
  writeConcern: <document>
})
2

Not the answer you're looking for? Browse other questions tagged or ask your own question.