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 Datetime
coleçã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);
}
javascript
mongodb
mongoose
Adam Zerner
fonte
fonte
Respostas:
DateTime.remove({}, callback)
O objeto vazio corresponderá a todos eles.fonte
Use deleteOne, deleteMany or bulkWrite instead.
em mangusto github.com/Automattic/mongoose/issues/6880.remove()
está obsoleto. em vez disso, podemos usar deleteManyDateTime.deleteMany({}, callback)
.fonte
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:
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!'); } }); });
fonte
<button ng-click="clear()">Clear</button>
.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); } };
fonte