Как удалить документы с помощью Node.js Mongoose?

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

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

Может ли кто-нибудь исправить?

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

ОБНОВЛЕНИЕ: версия 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 для получения дополнительной информации.

Ответ 4

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

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

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

Ответ 5

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

FBFriendModel.remove().exec();

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

Код выше удаляет ВСЕ пользователей с именем "Алиса" вместо первого.

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

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

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

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

Ответ 9

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

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

TeleBot.deleteMany({chatID: chatID}, function (err, _) {
                if (err) {
                    return console.log(err);
                }
            });

Ответ 11

Если вы ищете только один объект для удаления, вы можете использовать

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

    });

В этом примере Mongoose удалит на основе соответствия req.params.id.

Ответ 12

.remove() работает как .find():

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

Ответ 13

Я предпочитаю обозначение обещания, где вам нужно, например,

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

Ответ 14

Для удаления документа я предпочитаю использовать 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();

Ответ 15

Вы можете просто использовать запрос непосредственно в функции remove, поэтому:

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

Ответ 16

Вы всегда можете использовать встроенную функцию 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;
    });

Ответ 17

Обновление: .remove() но это все еще работает для более старых версий

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

Ответ 18

используя метод remove(), который вы можете удалить.

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

Ответ 19

Это сработало для меня, просто попробуйте это:

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

Ответ 20

Согласно Samyak Jain Answer, я использую Async Await

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

Ответ 21

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