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

Lesezeit: 6 Minuten

Benutzer-Avatar
Adam Zerner

Ich weiß wie…

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

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

In meinem Beispiel habe ich eine Datetime Sammlung, und ich 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("https://stackoverflow.com/", controller.index);
router.get('/:id', controller.show);
router.post("https://stackoverflow.com/", 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);
}

  • Sie müssen eine Löschroute mit einem Ajax-Löschvorgang erstellen. Zeigen Sie mir den HTML-Code-Button.

    Benutzer3998237

    25. Januar 2015 um 18:11 Uhr

  • jetzt kann ich dir helfen.. nur eine Sekunde, ich werde den Code machen.

    Benutzer3998237

    25. Januar 2015 um 18:13 Uhr

  • Zeigen Sie mir bitte den HTML-Button.

    Benutzer3998237

    25. Januar 2015 um 18:13 Uhr

  • @MrBearAndBear – Ich habe den Code für die Schaltfläche noch nicht geschrieben. Die Schaltfläche sendet nur eine AJAX-Anforderung an den Endpunkt – ich muss nur wissen, wie der Endpunkt strukturiert wird.

    – Adam Zerner

    25. Januar 2015 um 18:16 Uhr


  • Schau dir meine Antwort @AdamZerner an

    Benutzer3998237

    25. Januar 2015 um 18:23 Uhr

DateTime.remove({}, callback) Das leere Objekt passt zu allen.

  • Bitte beachten Sie, dass .remove() veraltet ist. Use deleteOne, deleteMany or bulkWrite instead. im Mungo github.com/Automattic/mongoose/issues/6880

    – Pedro Luz

    3. Januar 2019 um 16:53 Uhr

  • @PedroLuz Ich habe Mongoose seit einem Jahr nicht mehr benutzt. Ich aktualisiere meine Antwort gerne, aber ich sehe Model#remove immer noch in den Dokumenten der neuesten Version. Die Diskussion, die Sie verlinkt haben, besagt, dass Mongo sie abgelehnt hat, Mongoose jedoch nicht. Gibt es eine bestimmte Version, in der es zur Veraltungsliste hinzugefügt wurde (oder eine Version, in der es voraussichtlich entfernt wird), damit ich in meinem “vor Version xyz …” explizit sein kann?

    – Chrisbajorin

    19. April 2019 um 16:34 Uhr

  • entfernen ist veraltet

    – Gazdagergo

    12. Juli 2019 um 12:52 Uhr

  • DeprecationWarning: collection.remove ist veraltet. Verwenden Sie stattdessen deleteOne, deleteMany oder bulkWrite. @chrisbajorin

    – Antonius

    30. März 2020 um 21:40 Uhr

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

DateTime.deleteMany({}, callback).

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 einzelnes Dokument zu entfernen.

Quelle: Mongodb.

Wenn Sie Mongo Sheel verwenden, tun Sie einfach Folgendes:

db.Datetime.remove({})

In Ihrem Fall benötigen Sie:

Sie haben mir die Schaltfläche “Löschen” nicht gezeigt, 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: "https://stackoverflow.com/",
                        success: function(response) {
                            if (response == 'error') {
                                console.log('Err!');
                            }
                            else {
                                alert('Success');
                                location.reload();
                            }
                        }
                    });
                } else {
                    alert('Canceled!');
                }
            });
        });

  • Gibt es eine Möglichkeit, dies mit Mongoose zu tun? Mein Stack ist Angular/Express/Node/Mongo. Ich benutze die Winkel-Fullstack Generator. Ich bin mir nicht sicher, wie ich Mongo-Befehle direkt ausführen soll, ich habe immer Mongoose verwendet.

    – Adam Zerner

    25. Januar 2015 um 18:10 Uhr

  • Benutzt du Express, um deine Routen zu definieren?

    Benutzer3998237

    25. Januar 2015 um 18:12 Uhr

  • Ich verwende Angular, also ist die Schaltfläche nur <button ng-click="clear()">Clear</button>.

    – Adam Zerner

    25. Januar 2015 um 18:26 Uhr

  • Es tut mir leid, ich aktualisiere meine Antwort. Mir war nicht klar, 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.

    Benutzer3998237

    25. Januar 2015 um 18:32 Uhr

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

Angenommen, Sie haben ein Tourmodell: 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, ich stelle auch den Verbindungscode bereit, um eine Verbindung mit dem Remote-Cluster herzustellen. 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);
  }
};

Your_Mongoose_Model.deleteMany({}) kann die Arbeit machen

Verweise:
https://mongoosejs.com/docs/api.html#query_Query-deleteMany
https://www.geeksforgeeks.org/mongoose-deletemany-function/

1228690cookie-checkWie können Sie mit Mongoose alle Dokumente aus einer Sammlung entfernen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy