Jak usunąć wszystkie dokumenty z kolekcji w Mongoose?

91

Wiem jak...

  • Usuń pojedynczy dokument.
  • Usuń samą kolekcję.
  • Usuń wszystkie dokumenty z kolekcji za pomocą Mongo.

Ale nie wiem, jak usunąć wszystkie dokumenty z kolekcji za pomocą Mongoose. Chcę to zrobić, gdy użytkownik kliknie przycisk. Zakładam, że muszę wysłać żądanie AJAX do jakiegoś punktu końcowego i poprosić punkt końcowy o usunięcie, ale nie wiem, jak obsłużyć usunięcie w punkcie końcowym.

W moim przykładzie mam Datetimekolekcję i chcę usunąć wszystkie dokumenty, gdy użytkownik kliknie przycisk.

api / datetime / index.js

'use strict';

var express = require('express');
var controller = require('./datetime.controller');

var router = express.Router();

router.get('/', controller.index);
router.get('/:id', controller.show);
router.post('/', controller.create);
router.put('/:id', controller.update);
router.patch('/:id', controller.update);
router.delete('/:id', controller.destroy);

module.exports = router;

api / datetime / datetime.controller.js

'use strict';

var _ = require('lodash');
var Datetime = require('./datetime.model');

// Get list of datetimes
exports.index = function(req, res) {
  Datetime.find(function (err, datetimes) {
    if(err) { return handleError(res, err); }
    return res.json(200, datetimes);
  });
};

// Get a single datetime
exports.show = function(req, res) {
  Datetime.findById(req.params.id, function (err, datetime) {
    if(err) { return handleError(res, err); }
    if(!datetime) { return res.send(404); }
    return res.json(datetime);
  });
};

// Creates a new datetime in the DB.
exports.create = function(req, res) {
  Datetime.create(req.body, function(err, datetime) {
    if(err) { return handleError(res, err); }
    return res.json(201, datetime);
  });
};

// Updates an existing datetime in the DB.
exports.update = function(req, res) {
  if(req.body._id) { delete req.body._id; }
  Datetime.findById(req.params.id, function (err, datetime) {
    if (err) { return handleError(res, err); }
    if(!datetime) { return res.send(404); }
    var updated = _.merge(datetime, req.body);
    updated.save(function (err) {
      if (err) { return handleError(res, err); }
      return res.json(200, datetime);
    });
  });
};

// Deletes a datetime from the DB.
exports.destroy = function(req, res) {
  Datetime.findById(req.params.id, function (err, datetime) {
    if(err) { return handleError(res, err); }
    if(!datetime) { return res.send(404); }
    datetime.remove(function(err) {
      if(err) { return handleError(res, err); }
      return res.send(204);
    });
  });
};

function handleError(res, err) {
  return res.send(500, err);
}
Adam Zerner
źródło
musisz utworzyć trasę usuwania z usunięciem AJAX. pokaż przycisk kodu HTML.
teraz mogę ci pomóc ... chwileczkę, zrobię kod.
pokaż przycisk html, proszę.
@MrBearAndBear - jeszcze nie napisałem kodu przycisku. Przycisk przesyła tylko żądanie AJAX do punktu końcowego - muszę tylko wiedzieć, jak zorganizować punkt końcowy.
Adam Zerner
sprawdź moją odpowiedź @AdamZerner

Odpowiedzi:

146

DateTime.remove({}, callback) Pusty obiekt będzie pasował do nich wszystkich.

chrisbajorin
źródło
16
Należy pamiętać, że .remove () jest przestarzałe. Use deleteOne, deleteMany or bulkWrite instead.in mongoose github.com/Automattic/mongoose/issues/6880
Pedro Luz
@PedroLuz Nie używałem Mongoose od roku. Z przyjemnością zaktualizuję moją odpowiedź, ale nadal widzę, że model nr został usunięty w dokumentach najnowszej wersji. Dyskusja, którą połączyłeś, mówi, że mongo je zdeprecjonowało, ale mangusta nie. Czy istnieje konkretna wersja, w której została dodana do listy nieaktualnych wersji (lub wersja, w której ma zostać usunięta), aby można było wyrazić to wprost w moim „przed wersją xyz ..”?
chrisbajorin
2
usunięcie jest przestarzałe
gazdagergo
DeprecationWarning: collection.remove jest przestarzała. Zamiast tego użyj deleteOne, deleteMany lub bulkWrite. @chrisbajorin
Anthony
70

.remove()jest przestarzałe. zamiast tego możemy użyć deleteMany

DateTime.deleteMany({}, callback).

Henok Tesfaye
źródło
15

W MongoDB metoda db.collection.remove () usuwa dokumenty z kolekcji. Możesz usunąć wszystkie dokumenty z kolekcji, usunąć wszystkie dokumenty spełniające warunek lub ograniczyć operację do usunięcia tylko jednego dokumentu.

Źródło: Mongodb .

Jeśli używasz sznura mongo, po prostu wykonaj:

db.Datetime.remove({})

W twoim przypadku potrzebujesz:

Nie pokazałeś mi przycisku usuwania, więc ten przycisk to tylko przykład:

<a class="button__delete"></a>

Zmień kontroler na:

exports.destroy = function(req, res, next) {
    Datetime.remove({}, function(err) {
            if (err) {
                console.log(err)
            } else {
                res.end('success');
            }
        }
    );
};

Wstaw tę metodę usuwania Ajax do pliku js klienta:

        $(document).ready(function(){
            $('.button__delete').click(function() {
                var dataId = $(this).attr('data-id');

                if (confirm("are u sure?")) {
                    $.ajax({
                        type: 'DELETE',
                        url: '/',
                        success: function(response) {
                            if (response == 'error') {
                                console.log('Err!');
                            }
                            else {
                                alert('Success');
                                location.reload();
                            }
                        }
                    });
                } else {
                    alert('Canceled!');
                }
            });
        });
SebaGra
źródło
Czy jest sposób, aby to zrobić z Mongoose? Mój stos to Angular / Express / Node / Mongo. Używam kątowe-fullstack generator. Nie jestem pewien, jak bezpośrednio uruchamiać polecenia mongo, zawsze używałem Mongoose.
Adam Zerner
Czy używasz ekspresu do definiowania tras?
Używam Angulara, więc przycisk jest po prostu <button ng-click="clear()">Clear</button>.
Adam Zerner
przepraszam, aktualizuję odpowiedź ... nie zdawałem sobie sprawy, że chcesz usunąć wszystkie kolekcje - '. Jeśli zaktualizujesz swój kod za pomocą my, pod koniec procesu usuwania strona zostanie ponownie załadowana.
0

Wersja powłoki MongoDB, wersja 4.2.6 Node, wersja
14.2.0

Zakładając, że masz model wycieczki: tourModel.js

const mongoose = require('mongoose');

const tourSchema = new mongoose.Schema({
  name: {
    type: String,
    required: [true, 'A tour must have a name'],
    unique: true,
    trim: true,
  },
  createdAt: {
    type: Date,
    default: Date.now(),
  },
});
const Tour = mongoose.model('Tour', tourSchema);

module.exports = Tour;

Teraz chcesz usunąć wszystkie wycieczki naraz ze swojego MongoDB, podam również kod połączenia, aby połączyć się ze zdalnym klastrem. Użyłem deleteMany (), jeśli nie przekażesz żadnych argumentów do deleteMany (), spowoduje to usunięcie wszystkich dokumentów w kolekcji Tour.

const mongoose = require('mongoose');
const Tour = require('./../../models/tourModel');
const conStr = 'mongodb+srv://lord:<PASSWORD>@cluster0-eeev8.mongodb.net/tour-guide?retryWrites=true&w=majority';
const DB = conStr.replace('<PASSWORD>','ADUSsaZEKESKZX');
mongoose.connect(DB, {
    useNewUrlParser: true,
    useCreateIndex: true,
    useFindAndModify: false,
    useUnifiedTopology: true,
  })
  .then((con) => {
    console.log(`DB connection successful ${con.path}`);
  });

const deleteAllData = async () => {
  try {
    await Tour.deleteMany();
    console.log('All Data successfully deleted');
  } catch (err) {
    console.log(err);
  }
};
Lord
źródło