Як видалити документи за допомогою Node.js Mongoose?


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

Сказане, здається, не працює. Записи все ще є.

Може хтось виправить?

Відповіді:


489

Якщо вам не здається, що це повторюється, спробуйте 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.


3
Це запускається до / після видалення проміжного програмного забезпечення? (деякі модельні методи обходять проміжне програмне забезпечення для документа, і я не впевнений, чи це один з них, документи незрозумілі)
hunterloftis

12
Я вважаю, що @hunterloftis вже зрозумів це, але для тих, хто читає відповідь - ні, це не буде запускати проміжне програмне забезпечення до / після окремих програм.
числа1311407

Здається, багато інших відповідей згадують, .exec()однак це зовсім не так. Чи .exec()потрібні побічні ефекти від його використання чи ні?
DanH

Документи зрозуміли (можливо, вони були оновлені), що це обходить проміжне програмне забезпечення - див. Нижню частину mongoosejs.com/docs/middleware.html - тому будьте обережні, використання цього методу може спричинити серйозні, важкі проблеми.
Джед Уотсон

1
чудова відповідь! які аргументи зворотного дзвінка?
k88074

299

ОНОВЛЕННЯ: версія мангуста (5.5.3)

delete () застаріле, і ви можете використовувати 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';
    }
});

ОНОВЛЕННЯ:

Щодо мангусти 3.8.1, існує кілька методів, які дозволяють безпосередньо видаляти документ, скажімо:

  • remove
  • findByIdAndRemove
  • findOneAndRemove

Для отримання додаткової інформації зверніться до документів мангуста API .


13
Як зазначається в інших коментарях до інших відповідей, це обходить проміжне програмне забезпечення, яке визначено на схемі, і може бути справді небезпечним. Тому використовуйте його лише в тому випадку, якщо ви розумієте, який вплив буде мати. Для отримання додаткової інформації див. Mongoosejs.com/docs/middleware.html
Джед Уотсон

2
Просто для запису, до цих пір я завжди використовував їх без побічних ефектів, звичайно, мені не довелося використовувати жодного проміжного програмного забезпечення у своїх проектах :)
diosney

8
remove(query)може потенційно спорожнити всю вашу колекцію, якщо ви випадково перейдете query = {}. З цієї причини я вважаю findOneAndRemove(query)за краще, якщо я видаляю лише один документ.
joeytwiddle

1
Також зауважте, що це не повертає запит, тому ні обіцянка. Ви не можете зробитиModel.remove({ _id: 'whatever' }).exec().then(...)
David

48

docs- це масив документів. тому у нього немаєmongooseModel.remove() методу.

Ви можете повторити та видалити кожен документ із масиву окремо.

Або - оскільки, схоже, ви знаходите документи за (мабуть) унікальним ідентифікатором - findOneзамість цього find.


5
Бачачи, як ця відповідь передбачає досить стару версію мангуста, я дійсно не заперечую проти того, щоб хтось змінив прийняту відповідь.
mtkopone

Це насправді один з кращих способів зробити це, оскільки він правильно викликає посередництво, визначене на схемі - див. Mongoosejs.com/docs/middleware.html . Ви повинні використовувати інші методи, лише якщо ви не використовуєте проміжне програмне забезпечення у своїй програмі, а потім обережно.
Джед Уотсон

41

Це найкраще для версії 3.8.1:

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

І це вимагає лише одного дзвінка БД. Використовуйте це з огляду на те, що ви не виконуєте жодних removeдій, що стосуються пошуку та видалення.


1
Поки вам не потрібно виконувати pre 'remove'дії, це добре працює.
Даніель Кмак

32

Просто робіть

FBFriendModel.remove().exec();

1
Простий і ефективний.
Багатий Аподака

1
Це повертає Обіцянку? Якщо так, то який об’єкт визначається при вирішенні Обіцянки?
Кенні Worden

@KennyWorden - ефективний підхід до пошуку відповіді -> mongoosejs.com/docs/api.html, тоді шукайте те, що ви хочете, але передбачте "#" для пошуку на сторінках у вашому веб-переглядачі, наприклад, пошук у "#save" і ви Побачимо, це повертає обіцянку.
Джейсон Себрінг

3
Це своєрідна небезпечна відповідь, не встановлюючи умову, вказану у видаленні ...
blak3r

29

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

22

remove()застаріло. Використовувати deleteOne(), deleteMany()або bulkWrite().

Я використовую код

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

1
Ця відповідь чесно потребує більшої кількості результатів. Він несправедливо розміщується внизу стовбура (оскільки він не отримав півтора десятиліття за давні голоси), але є єдиною відповіддю, яка вирішує питання про:(node:9132) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
Стівен Вентімілья,

18

Для узагальнення ви можете використовувати:

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

Будьте обережні з FindOne та видаліть!

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

Код вище видаляє ВСІХ користувачів на ім'я "Аліса" замість лише першого .

До речі, я вважаю за краще видалити такі документи:

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

Або надішліть зворотний дзвінок і опустіть exec ()

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


12

Якщо ви шукаєте лише один об’єкт, який потрібно видалити, ви можете використовувати його

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

    });

У цьому прикладі Mongoose видалить на основі відповідності req.params.id.


Ласкаво просимо до Stackoverflow. Ваша відповідь - це дублікат декількох відповідей у ​​цій темі. Крім того, ви завжди повинні перевіряти наявність помилок у ваших зворотних дзвінках.
VtoCorleone

9

.remove()працює як .find():

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

9

Я віддаю перевагу нотаційним обіцянкам, де вам потрібно, наприклад

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

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

6

Ви можете просто використовувати запит безпосередньо у функції видалення, таким чином:

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

6

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

5

Оновлення: .remove()знецінюється, але це все ще працює для старих версій

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

Модель.remove застаріла
Maxwell sc

2

використовуючи метод delete (), який ви можете видалити.

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

Модель.remove застаріла
Maxwell sc

1
Maxwell sc, зробіть запит на редагування і виправте. Я знаю, що ви новачок у ЗП, але корисніше це виправити, ніж коментувати, що він знецінився. Можливо, ви можете запропонувати редагування наступного разу або зробити редагування самостійно і трохи взяти участь у ситуації ...
Джошуа Майкл Вагонер

1

Це працювало для мене, просто спробуйте:

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

Model.removeзастаріло
Maxwell sc

1

Відповідно до відповіді Сам’яка Джайна, я використовую Async Await

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

0

Мені дуже подобається ця схема в програмах async / очікують здатних програм 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)
}))

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

@MR: Як це може бути лише посиланням, коли у відповіді немає посилання ?? Також перевірте:
BDL

Шрик мізерний. Але все ж це низька якість.
MR
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.