Wie können Sie mit Mongoose alle Dokumente aus einer Sammlung entfernen?

91

Ich weiß wie...

  • Entfernen Sie ein einzelnes Dokument.
  • Entfernen Sie die Sammlung selbst.
  • Entfernen Sie alle Dokumente mit Mongo aus der Sammlung.

Aber ich weiß nicht, wie ich mit Mongoose alle Dokumente aus der Sammlung entfernen soll. Ich möchte dies tun, wenn der Benutzer auf eine Schaltfläche klickt. Ich gehe davon aus, dass ich eine AJAX-Anfrage an einen Endpunkt senden muss und der Endpunkt die Entfernung durchführen muss, aber ich weiß nicht, wie ich die Entfernung am Endpunkt behandeln soll.

In meinem Beispiel habe ich eine DatetimeSammlung und möchte alle Dokumente entfernen, wenn der Benutzer auf eine Schaltfläche klickt.

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
quelle
Sie müssen eine Löschroute mit einem Ajax-Löschvorgang erstellen. Zeigen Sie mir die HTML-Code-Schaltfläche.
Jetzt kann ich dir helfen. Nur eine Sekunde, ich werde den Code machen.
Zeigen Sie mir bitte den HTML-Button.
@ MrBearAndBear - Ich habe den Code für die Schaltfläche noch nicht geschrieben. Die Schaltfläche sendet nur eine AJAX-Anfrage an den Endpunkt - ich muss nur wissen, wie der Endpunkt strukturiert wird.
Adam Zerner
Überprüfen Sie meine Antwort @AdamZerner

Antworten:

145

DateTime.remove({}, callback) Das leere Objekt stimmt mit allen überein.

Chrisbajorin
quelle
16
Bitte beachten Sie, dass .remove () veraltet ist. Use deleteOne, deleteMany or bulkWrite instead.in Mungo github.com/Automattic/mongoose/issues/6880
Pedro Luz
@ PedroLuz Ich habe seit einem Jahr keinen Mungo mehr benutzt. Ich bin froh, meine Antwort zu aktualisieren, aber ich sehe immer noch, dass Model # in den Dokumenten der neuesten Version entfernt wird. Die Diskussion, die Sie verlinkt haben, besagt, dass Mongo sie veraltet hat, Mungo jedoch nicht. Gibt es eine bestimmte Version, in der es der Verfallsliste hinzugefügt wurde (oder eine Version, in der es voraussichtlich entfernt wird), damit ich in meinem "vor Version xyz .." explizit angeben kann?
Chrisbajorin
2
Entfernen ist veraltet
Gazdagergo
DeprecationWarning: collection.remove ist veraltet. Verwenden Sie stattdessen deleteOne, deleteMany oderulkWrite. @chrisbajorin
Anthony
70

.remove()ist veraltet. Stattdessen können wir deleteMany verwenden

DateTime.deleteMany({}, callback).

Henok Tesfaye
quelle
15

In MongoDB entfernt die Methode db.collection.remove () Dokumente aus einer Sammlung. Sie können alle Dokumente aus einer Sammlung entfernen, alle Dokumente entfernen, die einer Bedingung entsprechen, oder den Vorgang einschränken, um nur ein einziges Dokument zu entfernen.

Quelle: Mongodb .

Wenn Sie Mongo Sheel verwenden, tun Sie einfach:

db.Datetime.remove({})

In Ihrem Fall benötigen Sie:

Sie haben mir die Schaltfläche "Löschen" nicht angezeigt, daher ist diese Schaltfläche nur ein Beispiel:

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

Ändern Sie den Controller auf:

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

Fügen Sie diese Ajax-Löschmethode in Ihre Client-JS-Datei ein:

        $(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
quelle
Gibt es eine Möglichkeit, dies mit Mungo zu tun? Mein Stack ist Angular / Express / Node / Mongo. Ich benutze den Angular-Fullstack- Generator. Ich bin mir nicht sicher, wie ich Mongo-Befehle direkt ausführen soll. Ich habe immer Mongoose verwendet.
Adam Zerner
Verwenden Sie Express, um Ihre Routen zu definieren?
Ich benutze Angular, also ist die Schaltfläche einfach <button ng-click="clear()">Clear</button>.
Adam Zerner
Es tut mir leid, ich aktualisiere meine Antwort. Ich wusste nicht, dass Sie alle Sammlungen löschen möchten - '. Wenn Sie Ihren Code mit my aktualisieren, wird die Seite am Ende des Löschvorgangs neu geladen.
0

MongoDB-Shell-Version v4.2.6
Node v14.2.0

Angenommen, Sie haben ein Tour-Modell: 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;

Jetzt möchten Sie alle Touren auf einmal aus Ihrer MongoDB löschen. Außerdem gebe ich den Verbindungscode für die Verbindung mit dem Remote-Cluster an. Ich habe deleteMany () verwendet. Wenn Sie keine Argumente an deleteMany () übergeben, werden alle Dokumente in der Tour-Sammlung gelöscht.

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