Как удалить документы с помощью Node.js Mongoose? - PullRequest
264 голосов
/ 27 апреля 2011
FBFriendModel.find({
    id: 333
}, function (err, docs) {
    docs.remove(); //Remove all the documents that match!
});

Вышеуказанное не работает.Записи все еще там.

Может кто-нибудь починить?

Ответы [ 20 ]

462 голосов
/ 22 апреля 2012

Если вам не хочется повторяться, попробуйте FBFriendModel.find({ id:333 }).remove( callback ); или FBFriendModel.find({ id:333 }).remove().exec();

mongoose.model.find возвращает Запрос , который имеет remove функцию .

279 голосов
/ 17 июля 2012

ОБНОВЛЕНИЕ: версия Mongoose (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';
    }
});

UPDATE

Начиная с mongoose 3.8.1, существует несколько методов, позволяющих вам напрямую удалить документ, например:

  • remove
  • findByIdAndRemove
  • findOneAndRemove

Обратитесь к документации API mongoose для получения дополнительной информации.

46 голосов
/ 28 апреля 2011

docs - это массив документов. так что у него нет mongooseModel.remove() метода.

Вы можете перебирать и удалять каждый документ в массиве отдельно.

Или - поскольку похоже, что вы находите документы по (возможно) уникальному идентификатору - используйте findOne вместо find.

38 голосов
/ 02 июня 2014

Это для меня самое лучшее с версии 3.8.1:

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

И для этого требуется только один вызов БД. Используйте это, если вы не выполняете никаких действий remove перед поиском и удалением.

32 голосов
/ 26 декабря 2012

Просто сделай

FBFriendModel.remove().exec();
28 голосов
/ 08 января 2013

mongoose.model.find() возвращает Объект запроса , который также имеет функцию remove().

Вы также можете использовать mongoose.model.findOne(), если хотите удалить только один уникальный документ.

В противном случае вы также можете следовать традиционному подходу, когда вы сначала извлекаете документ, а затем удаляете.удалить документ (ы):

yourModelObj.findOneAndRemove(conditions, options, callback)

yourModelObj.findByIdAndRemove(id, options, callback)

yourModelObj.remove(conditions, callback);

var query = Comment.remove({ _id: id });
query.exec();
18 голосов
/ 27 февраля 2012

Для обобщения вы можете использовать:

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
});
18 голосов
/ 28 декабря 2013

Будьте осторожны с findOne и удалите!

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

Приведенный выше код удаляет ВСЕХ пользователей с именем 'Алиса' вместо первого *Только 1009 *.

Кстати, я предпочитаю удалять документы следующим образом:

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

Или предоставлять обратный вызов и опускать exec ()

  User.remove({...}, callback);
15 голосов
/ 03 января 2019

remove() устарело. Используйте deleteOne(), deleteMany() или bulkWrite().

Код, который я использую

TeleBot.deleteMany({chatID: chatID}, function (err, _) {
                if (err) {
                    return console.log(err);
                }
            });
14 голосов
/ 03 июля 2013
model.remove({title:'danish'}, function(err){
    if(err) throw err;
});

Ссылка: http://mongoosejs.com/docs/api.html#model_Model.remove

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...