Як видалити документи за допомогою 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.