如何使用Mongoose从集合中删除所有文档?


91

我会...

  • 删除单个文档。
  • 删除集合本身。
  • 使用Mongo从集合中删除所有文档。

但是我不知道如何使用Mongoose从集合中删除所有文档。当用户单击按钮时,我想这样做。我假设我需要向某个端点发送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 delete创建删除路由。给我看html代码按钮。

现在我可以为您提供帮助..一秒钟,我将编写代码。

请告诉我html按钮。

@MrBearAndBear-我还没有为按钮编写代码。该按钮只是向端点提交AJAX请求-我只需要知道如何构造端点即可。
亚当·泽纳

看看我的答案@AdamZerner

Answers:


146

DateTime.remove({}, callback) 空对象将匹配所有这些对象。


16
请注意,.remove()已被弃用。Use deleteOne, deleteMany or bulkWrite instead.在猫鼬 github.com/Automattic/mongoose/issues/6880
Pedro Luz

@PedroLuz我一年没有用过猫鼬了。我很高兴更新答案,但在最新版本的文档中仍然看到Model#remove。您所链接的讨论是说mongo已弃用它们,但mongoose没有。是否有特定的版本将其添加到弃用列表(或预期将在其中删除的版本)中,以便可以在“ xyz之前的版本..”中明确显示?
chrisbajorin '19

2
建议

DeprecationWarning:不建议使用collection.remove。请改用deleteOne,deleteMany或bulkWrite。@chrisbajorin
Anthony

70

.remove()不推荐使用。相反,我们可以使用deleteMany

DateTime.deleteMany({}, callback)


15

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

在客户端js文件中插入以下ajax delete方法:

        $(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。
亚当·泽纳

您是否使用Express定义路线?

我正在使用Angular,因此按钮为<button ng-click="clear()">Clear</button>
亚当·泽纳

对不起,我更新了答案。.我没有意识到您要删除所有收藏集-'。如果您用我更新您的代码,则在删除过程结束时,页面将重新加载。

0

MongoDB Shell版本v4.2.6
节点v14.2.0

假设您有一个游览模型: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(),如果不将任何参数传递给deleteMany(),则它将删除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);
  }
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.