Làm cách nào bạn có thể xóa tất cả tài liệu khỏi bộ sưu tập với Mongoose?


91

Tôi biết cách ...

  • Xóa một tài liệu duy nhất.
  • Xóa chính bộ sưu tập.
  • Xóa tất cả tài liệu khỏi bộ sưu tập với Mongo.

Nhưng tôi không biết cách xóa tất cả tài liệu khỏi bộ sưu tập bằng Mongoose. Tôi muốn thực hiện việc này khi người dùng nhấp vào một nút. Tôi giả sử rằng tôi cần gửi một yêu cầu AJAX đến một số điểm cuối và yêu cầu điểm cuối thực hiện việc xóa, nhưng tôi không biết cách xử lý việc xóa ở điểm cuối.

Trong ví dụ của tôi, tôi có một Datetimebộ sưu tập và tôi muốn xóa tất cả các tài liệu khi người dùng nhấp vào một nút.

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

bạn cần tạo một lộ trình xóa bằng cách xóa ajax. cho tôi xem nút mã html.

bây giờ tôi có thể giúp bạn .. chỉ một giây, tôi sẽ tạo mã.

làm ơn cho tôi xem nút html.

@MrBearAndBear - Tôi chưa viết mã cho nút. Nút chỉ gửi một yêu cầu AJAX đến điểm cuối - tôi chỉ cần biết cách cấu trúc điểm cuối.
Adam Zerner

kiểm tra câu trả lời của tôi @AdamZerner

Câu trả lời:


146

DateTime.remove({}, callback) Đối tượng rỗng sẽ khớp với tất cả chúng.


16
Xin lưu ý rằng .remove () không được dùng nữa. Use deleteOne, deleteMany or bulkWrite instead.trong mongoose github.com/Automattic/mongoose/issues/6880
Pedro Luz

@PedroLuz Tôi đã không sử dụng Mongoose trong một năm. Tôi rất vui khi cập nhật câu trả lời của mình, nhưng tôi vẫn thấy Model # remove trong tài liệu của phiên bản gần đây nhất. Cuộc thảo luận mà bạn đã liên kết nói rằng mongo đã không dùng chúng, nhưng mongoose thì không. Có bản phát hành cụ thể nào mà nó đã được thêm vào danh sách không dùng nữa (hoặc một phiên bản mà nó dự kiến ​​sẽ bị xóa) để tôi có thể rõ ràng trong "trước phiên bản xyz .." của mình không?
chrisbajorin

2
loại bỏ không được dùng nữa
gazdagergo

DeprecationWarning: collection.remove không được dùng nữa. Thay vào đó, hãy sử dụng deleteOne, deleteMany hoặc số lượng lớn. @chrisbajorin
Anthony

71

.remove()không được dùng nữa. thay vào đó chúng ta có thể sử dụng deleteMany

DateTime.deleteMany({}, callback).


15

Trong MongoDB, phương thức db.collection.remove () xóa tài liệu khỏi bộ sưu tập. Bạn có thể xóa tất cả tài liệu khỏi bộ sưu tập, xóa tất cả tài liệu phù hợp với điều kiện hoặc giới hạn thao tác để chỉ xóa một tài liệu duy nhất.

Nguồn: Mongodb .

Nếu bạn đang sử dụng mongo sheel, chỉ cần làm:

db.Datetime.remove({})

Trong trường hợp của bạn, bạn cần:

Bạn đã không cho tôi xem nút xóa, vì vậy nút này chỉ là một ví dụ:

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

Thay đổi bộ điều khiển thành:

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

Chèn phương pháp xóa ajax này vào tệp js khách hàng của bạn:

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

Có cách nào để làm điều này với Mongoose không? Ngăn xếp của tôi là Angular / Express / Node / Mongo. Tôi đang sử dụng trình tạo góc-fullstack . Tôi không chắc làm thế nào để chạy các lệnh mongo trực tiếp, tôi đã luôn sử dụng Mongoose.
Adam Zerner

bạn đang sử dụng express để xác định các tuyến đường của bạn?

Tôi đang sử dụng Angular, vì vậy nút chỉ là <button ng-click="clear()">Clear</button>.
Adam Zerner

tôi xin lỗi, tôi cập nhật câu trả lời của mình .. tôi không nhận ra rằng bạn muốn xóa tất cả các bộ sưu tập - '. Nếu bạn cập nhật mã của bạn với mã của tôi, trong phần cuối của quá trình xóa, trang sẽ tải lại.

0

Phiên bản shell MongoDB v4.2.6
Node v14.2.0

Giả sử bạn có Mô hình tham quan: 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;

Bây giờ bạn muốn xóa tất cả các chuyến tham quan cùng một lúc khỏi MongoDB của mình, tôi cũng cung cấp mã kết nối để kết nối với cụm từ xa. Tôi đã sử dụng deleteMany (), nếu bạn không chuyển bất kỳ args nào đến deleteMany (), thì nó sẽ xóa tất cả các tài liệu trong bộ sưu tập 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);
  }
};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.