【问题标题】:How can you remove all documents from a collection with Mongoose?如何使用 Mongoose 从集合中删除所有文档?
【发布时间】:2015-03-24 05:56:02
【问题描述】:

我知道如何...

  • 删除单个文档。
  • 删除集合本身。
  • 使用 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 删除创建删除路由。显示 html 代码按钮。
  • 现在我可以帮助你.. 等一下,我会编写代码。
  • 请给我看一下html按钮。
  • @MrBearAndBear - 我还没有为按钮编写代码。该按钮只是向端点提交 AJAX 请求 - 我只需要知道如何构建端点。
  • 看看我的回答@AdamZerner

标签: javascript mongodb mongoose


【解决方案1】:

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

【讨论】:

  • 请注意 .remove() 已被弃用。 Use deleteOne, deleteMany or bulkWrite instead. 在猫鼬中 github.com/Automattic/mongoose/issues/6880
  • @PedroLuz 我一年没用过猫鼬了。我很高兴更新我的答案,但我仍然在最新版本的文档中看到 Model#remove。您链接的讨论是说 mongo 已弃用它们,但 mongoose 没有。是否有将其添加到弃用列表的特定版本(或预期将其删除的版本),以便我可以在“x.y.z 版本之前...”中明确说明?
  • 删除已弃用
  • 弃用警告:collection.remove 已弃用。请改用 deleteOne、deleteMany 或 bulkWrite。 @chrisbajorin
【解决方案2】:

.remove() 已弃用。相反,我们可以使用 deleteMany

DateTime.deleteMany({}, callback).

【讨论】:

    【解决方案3】:

    在 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删除方法:

            $(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。我正在使用angular-fullstack 生成器。不知道怎么直接运行mongo命令,一直用Mongoose。
    • 您是否使用 express 来定义您的路线?
    • 我使用的是 Angular,所以按钮只是 &lt;button ng-click="clear()"&gt;Clear&lt;/button&gt;
    • 很抱歉,我更新了我的答案.. 我没有意识到您要删除所有集合--'。如果你用我的更新你的代码,在删除过程结束时,页面将重新加载。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-04
        • 2018-10-19
        • 1970-01-01
        • 2017-09-28
        • 2021-01-08
        • 1970-01-01
        • 1970-01-01
        • 2020-09-08
        相关资源
        最近更新 更多