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

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

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

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

Теги:
express
authentication

18 ответов

43
Лучший ответ

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

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

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

  • 5
    Поскольку этот ответ предполагает довольно старую версию мангуста, я бы не стал возражать против того, чтобы кто-то изменил принятый ответ.
  • 0
    На самом деле это один из лучших способов сделать это, потому что он правильно вызывает промежуточное программное обеспечение, определенное в схеме - см. Mongoosejs.com/docs/middleware.html . Вы должны использовать другие методы, только если вы НЕ используете промежуточное программное обеспечение в своем приложении, а затем с осторожностью.
446

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

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

  • 3
    Это работает до / после удаления промежуточного программного обеспечения? (некоторые методы модели обходят промежуточное программное обеспечение документа, и я не уверен, является ли это одним из них, документы неясны)
  • 11
    Я предполагаю, что @hunterloftis уже понял это, но для всех, кто читает, ответ «нет», это не будет запускать промежуточное программное обеспечение до / после на отдельных документах.
Показать ещё 9 комментариев
276

Как и в случае с "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

Дополнительную информацию см. в mongoose API docs.

  • 13
    Как отмечалось в других комментариях к другим ответам, это обходит промежуточное программное обеспечение, определенное в схеме, и может быть действительно опасным. Так что используйте его, только если вы понимаете, какое влияние это окажет. Для получения дополнительной информации см. Mongoosejs.com/docs/middleware.html
  • 0
    Конечно, разъяснение действительно, спасибо.
Показать ещё 3 комментария
34

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

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

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

  • 1
    Пока вам не нужно выполнять pre 'remove' действия по pre 'remove' он работает нормально.
  • 0
    Правда я обновлю свой ответ.
29

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

FBFriendModel.remove().exec();
  • 1
    Просто и эффективно.
  • 1
    Возвращает ли это обещание? Если да, какой объект определяется при выполнении Обещания?
Показать ещё 2 комментария
25

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

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

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

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

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

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

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

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

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

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
});
14
model.remove({title:'danish'}, function(err){
    if(err) throw err;
});

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

10

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

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

    });

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

  • 0
    Добро пожаловать в Stackoverflow. Ваш ответ является дубликатом нескольких ответов в этой теме. Кроме того, вы всегда должны проверять наличие ошибок в ваших обратных вызовах.
9

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

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

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

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

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

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

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

Работает для любой версии мангуста, которую я использовал

YourSchema.remove({
    foo: req.params.foo
}, function(err, _) {
    if (err) return res.send(err)
    res.json({
        message: `deleted ${ req.params.foo }`
    })
});
  • 0
    Model.remove устарела
4

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

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

getLogout(data){
        return this.sessionModel
        .remove({session_id: data.sid})
        .exec()
        .then(data =>{
            return "signup successfully"
        })
    }
  • 0
    Model.remove устарела
  • 1
    Maxwell sc, затем сделайте запрос на редактирование и исправьте. Я знаю, что вы новичок в SO, но гораздо полезнее исправить это, чем комментировать, что он устарел. Может быть, вы могли бы предложить изменить в следующий раз, или сделать редактирование самостоятельно, и немного взять на себя ответственность за ситуацию ...
0

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

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
        })
      });
  • 0
    Model.remove устарела

Ещё вопросы

Сообщество Overcoder
Наверх
Меню