Come puoi rimuovere tutti i documenti da una raccolta con Mongoose?


91

Io so come...

  • Rimuovi un singolo documento.
  • Rimuovi la raccolta stessa.
  • Rimuovi tutti i documenti dalla raccolta con Mongo.

Ma non so come rimuovere tutti i documenti dalla raccolta con Mongoose. Voglio farlo quando l'utente fa clic su un pulsante. Presumo che sia necessario inviare una richiesta AJAX a un endpoint e fare in modo che l'endpoint esegua la rimozione, ma non so come gestire la rimozione all'endpoint.

Nel mio esempio, ho una Datetimeraccolta e desidero rimuovere tutti i documenti quando l'utente fa clic su un pulsante.

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

è necessario creare un percorso di eliminazione con un ajax delete. mostrami il pulsante del codice html.

ora posso aiutarti .. solo un secondo, creerò il codice.

mostrami il pulsante html, per favore.

@MrBearAndBear - Non ho ancora scritto il codice per il pulsante. Il pulsante invia semplicemente una richiesta AJAX all'endpoint: ho solo bisogno di sapere come strutturare l'endpoint.
Adam Zerner

controlla la mia risposta @AdamZerner

Risposte:


148

DateTime.remove({}, callback) L'oggetto vuoto corrisponderà a tutti loro.


16
Tieni presente che .remove () è deprecato. Use deleteOne, deleteMany or bulkWrite instead.in mongoose github.com/Automattic/mongoose/issues/6880
Pedro Luz

@PedroLuz Non uso Mongoose da un anno. Sono felice di aggiornare la mia risposta, ma vedo ancora Model # remove nei documenti della versione più recente. La discussione che hai collegato dice che mongo li ha deprecati, ma mangusta no. Esiste una versione specifica in cui è stata aggiunta all'elenco dei deprecati (o una versione in cui si prevede che venga rimossa) in modo che io possa essere esplicito nella mia "versione precedente xyz .."?
chrisbajorin

2
rimuovere è deprecato
gazdagergo

DeprecationWarning: collection.remove è deprecato. Utilizza invece deleteOne, deleteMany o bulkWrite. @chrisbajorin
Anthony

76

.remove()è deprecato. invece possiamo usare deleteMany

DateTime.deleteMany({}, callback).


16

In MongoDB, il metodo db.collection.remove () rimuove i documenti da una raccolta. È possibile rimuovere tutti i documenti da una raccolta, rimuovere tutti i documenti che soddisfano una condizione o limitare l'operazione per rimuovere un solo documento.

Fonte: Mongodb .

Se stai usando mongo sheel, fai semplicemente:

db.Datetime.remove({})

Nel tuo caso, hai bisogno di:

Non mi hai mostrato il pulsante Elimina, quindi questo pulsante è solo un esempio:

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

Cambia il controller in:

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

Inserisci questo metodo di eliminazione ajax nel file js del tuo client:

        $(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!');
                }
            });
        });

C'è un modo per farlo con Mongoose? Il mio stack è Angular / Express / Node / Mongo. Sto usando il generatore fullstack angolare . Non sono sicuro di come eseguire direttamente i comandi mongo, ho sempre usato Mongoose.
Adam Zerner

stai usando express per definire i tuoi percorsi?

Sto usando Angular, quindi il pulsante è solo <button ng-click="clear()">Clear</button>.
Adam Zerner

mi dispiace, aggiorno la mia risposta .. non mi ero accorto che vuoi cancellare tutte le raccolte - '. Se aggiorni il tuo codice con il mio, alla fine del processo di cancellazione, la pagina si ricaricherà.

1

Versione shell MongoDB v4.2.6
Nodo v14.2.0

Supponendo che tu abbia un modello di tour: 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;

Ora vuoi eliminare tutti i tour contemporaneamente dal tuo MongoDB, fornisco anche il codice di connessione per connettersi al cluster remoto. Ho usato deleteMany (), se non passi alcun argomento a deleteMany (), eliminerà tutti i documenti nella raccolta 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);
  }
};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.