Bagaimana Anda bisa menghapus semua dokumen dari koleksi dengan Mongoose?

91

Saya tahu bagaimana ...

  • Hapus satu dokumen.
  • Hapus koleksinya sendiri.
  • Hapus semua dokumen dari koleksi dengan Mongo.

Tapi saya tidak tahu bagaimana menghapus semua dokumen dari koleksi dengan Mongoose. Saya ingin melakukan ini saat pengguna mengklik tombol. Saya berasumsi bahwa saya perlu mengirim permintaan AJAX ke beberapa titik akhir dan meminta titik akhir melakukan penghapusan, tetapi saya tidak tahu bagaimana menangani penghapusan di titik akhir.

Dalam contoh saya, saya memiliki Datetimekoleksi, dan saya ingin menghapus semua dokumen saat pengguna mengklik tombol.

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
sumber
Anda perlu membuat rute hapus dengan ajax delete. tunjukkan tombol kode html.
sekarang saya dapat membantu u .. tunggu sebentar, saya akan membuat kode.
tolong tunjukkan saya tombol html.
@MrBearAndBear - Saya belum menulis kode untuk tombol tersebut. Tombol ini hanya mengirimkan permintaan AJAX ke titik akhir - saya hanya perlu tahu cara menyusun titik akhir.
Adam Zerner
lihat jawaban saya @AdamZerner

Jawaban:

146

DateTime.remove({}, callback) Objek kosong akan cocok dengan semuanya.

chrisbajorin.dll
sumber
16
Perlu diketahui bahwa .remove () sudah tidak digunakan lagi. Use deleteOne, deleteMany or bulkWrite instead.di luwak github.com/Automattic/mongoose/issues/6880
Pedro Luz
@PedroLuz Saya belum pernah menggunakan Mongoose dalam setahun. Saya dengan senang hati memperbarui jawaban saya, tetapi saya masih melihat Model # dihapus di dokumen dari versi terbaru. Diskusi yang Anda tautkan mengatakan bahwa mongo telah mencela mereka, tetapi luwak belum. Apakah ada rilis tertentu yang ditambahkan ke daftar deprecation (atau versi yang diharapkan untuk dihapus) sehingga saya bisa eksplisit dalam "sebelum versi xyz .."?
chrisbajorin
2
hapus tidak berlaku lagi
gazdagergo
DeprecationWarning: collection.remove tidak digunakan lagi. Gunakan deleteOne, deleteMany, atau bulkWrite sebagai gantinya. @chrisbajorin
Anthony
70

.remove()sudah ditinggalkan. sebagai gantinya kita bisa menggunakan deleteMany

DateTime.deleteMany({}, callback).

Henok Tesfaye
sumber
15

Di MongoDB, metode db.collection.remove () menghapus dokumen dari koleksi. Anda dapat menghapus semua dokumen dari koleksi, menghapus semua dokumen yang cocok dengan kondisi, atau membatasi operasi untuk menghapus hanya satu dokumen.

Sumber: Mongodb .

Jika Anda menggunakan mongo sheel, lakukan saja:

db.Datetime.remove({})

Dalam kasus Anda, Anda membutuhkan:

Anda tidak menunjukkan tombol hapus, jadi tombol ini hanyalah sebuah contoh:

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

Ubah pengontrol menjadi:

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

Masukkan metode hapus ajax ini di file js klien Anda:

        $(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
sumber
Apakah ada cara untuk melakukan ini dengan luwak? Tumpukan saya adalah Angular / Express / Node / Mongo. Saya menggunakan generator angular-fullstack . Saya tidak yakin bagaimana menjalankan perintah mongo secara langsung, saya selalu menggunakan Mongoose.
Adam Zerner
apakah Anda menggunakan express untuk menentukan rute Anda?
Saya menggunakan Angular, jadi tombolnya pas <button ng-click="clear()">Clear</button>.
Adam Zerner
maaf, saya memperbarui jawaban saya .. saya tidak menyadari bahwa Anda ingin menghapus semua koleksi - '. Jika Anda memperbarui kode Anda dengan my, di akhir proses penghapusan, halaman akan dimuat ulang.
0

Versi shell MongoDB v4.2.6
Node v14.2.0

Dengan asumsi Anda memiliki Model Tur: 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;

Sekarang Anda ingin menghapus semua tur sekaligus dari MongoDB Anda, saya juga memberikan kode koneksi untuk terhubung dengan cluster jarak jauh. Saya menggunakan deleteMany (), jika Anda tidak meneruskan argumen ke deleteMany (), maka itu akan menghapus semua dokumen dalam koleksi 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);
  }
};
Tuan
sumber