คุณจะลบเอกสารทั้งหมดออกจากคอลเลกชันด้วย Mongoose ได้อย่างไร?


91

ฉันรู้วิธี ...

  • ลบเอกสารเดียว
  • นำคอลเล็กชันออก
  • ลบเอกสารทั้งหมดออกจากคอลเล็กชันด้วย Mongo

แต่ฉันไม่รู้ว่าจะเอาเอกสารทั้งหมดออกจากคอลเลกชันด้วยพังพอนได้อย่างไร ฉันต้องการทำสิ่งนี้เมื่อผู้ใช้คลิกปุ่ม ฉันคิดว่าฉันต้องส่งคำขอ AJAX ไปยังจุดสิ้นสุดบางจุดและให้ปลายทางทำการลบ แต่ฉันไม่รู้วิธีจัดการกับการลบที่จุดสิ้นสุด

ในตัวอย่างของฉันฉันมีDatetimeคอลเล็กชันและฉันต้องการลบเอกสารทั้งหมดเมื่อผู้ใช้คลิกปุ่ม

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

คุณต้องสร้างเส้นทางการลบด้วยการลบ ajax แสดงปุ่มรหัส html

ตอนนี้ฉันช่วยคุณได้แล้ว .. อีกสักครู่ฉันจะสร้างรหัส

ขอดูปุ่ม html หน่อย

@MrBearAndBear - ฉันยังไม่ได้เขียนโค้ดสำหรับปุ่มนี้ ปุ่มเพียงแค่ส่งคำขอ AJAX ไปยังจุดสิ้นสุด - ฉันแค่ต้องรู้วิธีจัดโครงสร้างปลายทาง
Adam Zerner

ตรวจสอบคำตอบของฉัน @AdamZerner

คำตอบ:


148

DateTime.remove({}, callback) วัตถุว่างจะตรงกับวัตถุทั้งหมด


16
โปรดทราบว่า. remove () กำลังเลิกใช้งาน Use deleteOne, deleteMany or bulkWrite instead.ใน mongoose github.com/Automattic/mongoose/issues/6880
Pedro Luz

@PedroLuz ฉันไม่ได้ใช้พังพอนในหนึ่งปี ฉันยินดีที่จะอัปเดตคำตอบของฉัน แต่ฉันยังเห็น Model # นำออกในเอกสารของเวอร์ชันล่าสุด การสนทนาที่คุณเชื่อมโยงคือการบอกว่า Mongo เลิกใช้งานแล้ว แต่พังพอนไม่ได้ทำ มีรุ่นใดรุ่นหนึ่งที่ถูกเพิ่มลงในรายการเลิกใช้งาน (หรือรุ่นที่คาดว่าจะถูกลบออก) เพื่อให้ฉันสามารถระบุอย่างชัดเจนใน "ก่อนหน้า xyz .. " ได้หรือไม่
chrisbajorin

2
ลบเลิกใช้แล้ว
gazdagergo

DeprecationWarning: collection.remove เลิกใช้แล้ว ใช้ deleteOne, deleteMany หรือ BulkWrite แทน @chrisbajorin
Anthony


16

ใน MongoDB เมธอด db.collection.remove () จะลบเอกสารออกจากคอลเล็กชัน คุณสามารถลบเอกสารทั้งหมดออกจากคอลเลกชันลบเอกสารทั้งหมดที่ตรงกับเงื่อนไขหรือ จำกัด การดำเนินการเพื่อลบเอกสารเพียงชุดเดียว

ที่มา: Mongodb .

หากคุณใช้ mongo sheel ให้ทำดังนี้

db.Datetime.remove({})

ในกรณีของคุณคุณต้อง:

คุณไม่ได้แสดงปุ่มลบให้ฉันเห็นปุ่มนี้เป็นเพียงตัวอย่าง:

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

เปลี่ยนตัวควบคุมเป็น:

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

แทรกวิธีการลบ ajax นี้ในไฟล์ js ไคลเอนต์ของคุณ:

        $(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!');
                }
            });
        });

พังพอนมีวิธีทำไหม? กองของฉันคือ Angular / Express / Node / Mongo ฉันใช้เครื่องกำเนิดไฟฟ้าเชิงมุม - ฟูลสแต็ก ฉันไม่แน่ใจว่าจะเรียกใช้คำสั่ง mongo โดยตรงได้อย่างไรฉันใช้ Mongoose มาตลอด
Adam Zerner

คุณใช้ Express เพื่อกำหนดเส้นทางของคุณหรือไม่?

<button ng-click="clear()">Clear</button>ฉันใช้เชิงมุมดังนั้นปุ่มเป็นเพียง
Adam Zerner

ฉันขอโทษฉันอัปเดตคำตอบของฉัน .. ฉันไม่รู้ว่าคุณต้องการลบคอลเล็กชันทั้งหมด - ' หากคุณอัปเดตรหัสของคุณด้วย my ในตอนท้ายของกระบวนการลบเพจจะโหลดซ้ำ

1

MongoDB เชลล์เวอร์ชัน v4.2.6
โหนด v14.2.0

สมมติว่าคุณมี Tour Model: 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;

ตอนนี้คุณต้องการลบทัวร์ชมทั้งหมดพร้อมกันจาก MongoDB ของคุณฉันยังให้รหัสการเชื่อมต่อเพื่อเชื่อมต่อกับคลัสเตอร์ระยะไกล ฉันใช้ deleteMany () หากคุณไม่ส่ง args ใด ๆ ไปยัง deleteMany () มันจะลบเอกสารทั้งหมดในคอลเลคชันทัวร์

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);
  }
};
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.