¿Cómo se pueden eliminar todos los documentos de una colección con Mongoose?

91

Yo se como...

  • Eliminar un solo documento.
  • Eliminar la colección en sí.
  • Elimina todos los documentos de la colección con Mongo.

Pero no sé cómo eliminar todos los documentos de la colección con Mongoose. Quiero hacer esto cuando el usuario hace clic en un botón. Supongo que necesito enviar una solicitud AJAX a algún punto final y que el punto final haga la eliminación, pero no sé cómo manejar la eliminación en el punto final.

En mi ejemplo, tengo una Datetimecolección y quiero eliminar todos los documentos cuando el usuario hace clic en un botón.

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
fuente
necesita crear una ruta de eliminación con una eliminación ajax. muéstrame el botón de código html.
ahora puedo ayudarte ... solo un segundo, haré el código.
muéstrame el botón html, por favor.
@MrBearAndBear: aún no he escrito el código para el botón. El botón simplemente envía una solicitud AJAX al punto final; solo necesito saber cómo estructurar el punto final.
Adam Zerner
mira mi respuesta @AdamZerner

Respuestas:

146

DateTime.remove({}, callback) El objeto vacío coincidirá con todos ellos.

chrisbajorin
fuente
16
Tenga en cuenta que .remove () está obsoleto. Use deleteOne, deleteMany or bulkWrite instead.en mongoose github.com/Automattic/mongoose/issues/6880
Pedro Luz
@PedroLuz No he usado Mongoose en un año. Me complace actualizar mi respuesta, pero todavía veo la eliminación de Model # en los documentos de la versión más reciente. La discusión que ha vinculado dice que mongo los ha desaprobado, pero mangosta no. ¿Existe una versión específica en la que se agregó a la lista de obsolescencia (o una versión en la que se espera que se elimine) para que pueda ser explícito en mi "anterior a la versión xyz .."?
chrisbajorin
2
eliminar está obsoleto
gazdagergo
DeprecationWarning: collection.remove está obsoleto. En su lugar, utilice deleteOne, deleteMany o bulkWrite. @chrisbajorin
Anthony
70

.remove()es obsoleto. en su lugar podemos usar deleteMany

DateTime.deleteMany({}, callback).

Henok Tesfaye
fuente
15

En MongoDB, el método db.collection.remove () elimina documentos de una colección. Puede eliminar todos los documentos de una colección, eliminar todos los documentos que coincidan con una condición o limitar la operación para eliminar solo un documento.

Fuente: Mongodb .

Si está usando mongo sheel, simplemente haga:

db.Datetime.remove({})

En tu caso, necesitas:

No me mostró el botón de eliminar, por lo que este botón es solo un ejemplo:

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

Cambie el controlador a:

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

Inserte este método de eliminación de ajax en el archivo js de su cliente:

        $(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
fuente
¿Hay alguna forma de hacer esto con Mongoose? Mi pila es Angular / Express / Node / Mongo. Estoy usando el generador de pila completa angular . No estoy seguro de cómo ejecutar los comandos de Mongo directamente, siempre he usado Mongoose.
Adam Zerner
¿Estás usando Express para definir tus rutas?
Estoy usando Angular, por lo que el botón es solo <button ng-click="clear()">Clear</button>.
Adam Zerner
lo siento, actualizo mi respuesta ... no me di cuenta de que desea eliminar todas las colecciones - '. Si actualizas tu código con my, al final del proceso de eliminación, la página se volverá a cargar.
0

MongoDB shell versión v4.2.6
Nodo v14.2.0

Suponiendo que tiene un modelo de viaje: 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;

Ahora desea eliminar todos los recorridos a la vez de su MongoDB, también proporciono el código de conexión para conectarse con el clúster remoto. Usé deleteMany (), si no pasa ningún argumento a deleteMany (), eliminará todos los documentos de la colección 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);
  }
};
Señor
fuente