Como você pode remover todos os documentos de uma coleção com o Mongoose?

91

Eu sei como...

  • Remova um único documento.
  • Remova a própria coleção.
  • Remova todos os documentos da coleção com o Mongo.

Mas não sei como remover todos os documentos da coleção com o Mongoose. Quero fazer isso quando o usuário clicar em um botão. Presumo que preciso enviar uma solicitação AJAX a algum endpoint e fazer com que o endpoint faça a remoção, mas não sei como lidar com a remoção no endpoint.

No meu exemplo, tenho uma Datetimecoleção e desejo remover todos os documentos quando o usuário clicar em um botão.

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
fonte
você precisa criar uma rota de exclusão com uma exclusão de ajax. mostre-me o botão de código html.
agora posso te ajudar .. só um segundo, farei o código.
mostre-me o botão html, por favor.
@MrBearAndBear - Ainda não escrevi o código do botão. O botão apenas envia uma solicitação AJAX para o terminal - eu só preciso saber como estruturar o terminal.
Adam Zerner
verifique minha resposta @AdamZerner

Respostas:

148

DateTime.remove({}, callback) O objeto vazio corresponderá a todos eles.

chrisbajorin
fonte
16
Esteja ciente de que .remove () está se tornando obsoleto. Use deleteOne, deleteMany or bulkWrite instead.em mangusto github.com/Automattic/mongoose/issues/6880
Pedro Luz
@PedroLuz Eu não uso o Mongoose há um ano. Estou feliz em atualizar minha resposta, mas ainda vejo Model # remove nos documentos da versão mais recente. A discussão que você vinculou diz que o mongo os tornou obsoletos, mas o mongoose não. Existe uma versão específica na qual ele foi adicionado à lista de reprovação (ou uma versão na qual se espera que seja removido) para que eu possa ser explícito em meu "anterior à versão xyz .."?
chrisbajorin de
2
remover está obsoleto
gazdagergo
DeprecationWarning: collection.remove está obsoleto. Use deleteOne, deleteMany ou bulkWrite. @chrisbajorin
Anthony
76

.remove()está obsoleto. em vez disso, podemos usar deleteMany

DateTime.deleteMany({}, callback).

Henok Tesfaye
fonte
16

No MongoDB, o método db.collection.remove () remove documentos de uma coleção. Você pode remover todos os documentos de uma coleção, remover todos os documentos que correspondem a uma condição ou limitar a operação para remover apenas um único documento.

Fonte: Mongodb .

Se você estiver usando mongo sheel, basta fazer:

db.Datetime.remove({})

No seu caso, você precisa de:

Você não me mostrou o botão de exclusão, então este botão é apenas um exemplo:

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

Mude o controlador para:

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

Insira este método de exclusão ajax no arquivo js do seu 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
fonte
Existe uma maneira de fazer isso com o Mongoose? Minha pilha é Angular / Express / Node / Mongo. Estou usando o gerador angular fullstack . Não tenho certeza de como executar comandos mongo diretamente, sempre usei o Mongoose.
Adam Zerner
você está usando o expresso para definir suas rotas?
Estou usando o Angular, então o botão é justo <button ng-click="clear()">Clear</button>.
Adam Zerner
desculpe, atualizei minha resposta .. não percebi que você queria excluir todas as coleções - '. Se vc atualizar seu código com meu, ao final do processo de deleção, a página será recarregada.
1

MongoDB shell versão v4.2.6
Node v14.2.0

Supondo que você tenha um modelo de passeio: 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;

Agora você deseja excluir todos os passeios de uma vez de seu MongoDB, também fornecendo o código de conexão para se conectar ao cluster remoto. Usei deleteMany (), se você não passar nenhum args para deleteMany (), ele excluirá todos os documentos na coleção 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);
  }
};
senhor
fonte