Comment supprimer tous les documents d'une collection avec Mongoose?


91

Je sais comment...

  • Supprimez un seul document.
  • Supprimez la collection elle-même.
  • Supprimez tous les documents de la collection avec Mongo.

Mais je ne sais pas comment supprimer tous les documents de la collection avec Mongoose. Je veux faire cela lorsque l'utilisateur clique sur un bouton. Je suppose que je dois envoyer une demande AJAX à un point de terminaison et que le point de terminaison effectue la suppression, mais je ne sais pas comment gérer la suppression au point de terminaison.

Dans mon exemple, j'ai une Datetimecollection et je souhaite supprimer tous les documents lorsque l'utilisateur clique sur un bouton.

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

vous devez créer une route de suppression avec une suppression ajax. montrez-moi le bouton de code html.

maintenant je peux vous aider .. juste une seconde, je vais faire le code.

montrez-moi le bouton html, s'il vous plaît.

@MrBearAndBear - Je n'ai pas encore écrit le code du bouton. Le bouton envoie simplement une requête AJAX au point de terminaison - j'ai juste besoin de savoir comment structurer le point de terminaison.
Adam Zerner

Découvrez ma réponse @AdamZerner

Réponses:


146

DateTime.remove({}, callback) L'objet vide correspondra à tous.


16
Veuillez noter que .remove () est obsolète. Use deleteOne, deleteMany or bulkWrite instead.dans mangouste github.com/Automattic/mongoose/issues/6880
Pedro Luz

@PedroLuz Je n'ai pas utilisé Mongoose depuis un an. Je suis heureux de mettre à jour ma réponse, mais je vois toujours le modèle # remove dans la documentation de la version la plus récente. La discussion que vous avez liée dit que mongo les a désapprouvés, mais pas la mangouste. Y a-t-il une version spécifique où elle a été ajoutée à la liste des obsolescences (ou une version dans laquelle elle devrait être supprimée) afin que je puisse être explicite dans mon "avant la version xyz .."?
chrisbajorin

2
remove is deprecated
gazdagergo

DeprecationWarning: collection.remove est obsolète. Utilisez plutôt deleteOne, deleteMany ou bulkWrite. @chrisbajorin
Anthony

70

.remove()est obsolète. à la place, nous pouvons utiliser deleteMany

DateTime.deleteMany({}, callback).


15

Dans MongoDB, la méthode db.collection.remove () supprime les documents d'une collection. Vous pouvez supprimer tous les documents d'une collection, supprimer tous les documents qui correspondent à une condition ou limiter l'opération pour ne supprimer qu'un seul document.

Source: Mongodb .

Si vous utilisez mongo sheel, faites simplement:

db.Datetime.remove({})

Dans votre cas, vous avez besoin de:

Vous ne m'avez pas montré le bouton de suppression, donc ce bouton n'est qu'un exemple:

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

Changez le contrôleur pour:

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

Insérez cette méthode de suppression ajax dans votre fichier js 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!');
                }
            });
        });

Y a-t-il un moyen de faire cela avec Mongoose? Ma pile est Angular / Express / Node / Mongo. J'utilise le générateur angular-fullstack . Je ne sais pas comment exécuter directement les commandes mongo, j'ai toujours utilisé Mongoose.
Adam Zerner

utilisez-vous express pour définir vos itinéraires?

J'utilise Angular, donc le bouton est juste <button ng-click="clear()">Clear</button>.
Adam Zerner

je suis désolé, j'ai mis à jour ma réponse .. je ne savais pas que vous vouliez supprimer toutes les collections - '. Si vous mettez à jour votre code avec my, à la fin du processus de suppression, la page se rechargera.

0

Version du shell MongoDB v4.2.6
Node v14.2.0

En supposant que vous ayez un modèle de tournée: 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;

Maintenant, vous souhaitez supprimer toutes les visites à la fois de votre MongoDB, je fournis également un code de connexion pour vous connecter au cluster distant. J'ai utilisé deleteMany (), si vous ne passez aucun argument à deleteMany (), alors il supprimera tous les documents de la collection 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);
  }
};
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.