Mongooseを使用してコレクションからすべてのドキュメントを削除するにはどうすればよいですか?


91

私は方法を知っています...

  • 1つのドキュメントを削除します。
  • コレクション自体を削除します。
  • 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);
}

ajaxdeleteを使用して削除ルートを作成する必要があります。HTMLコードボタンを見せてください。

今、私はあなたを助けることができます..ちょっと待って、私はコードを作ります。

HTMLボタンを見せてください。

@ MrBearAndBear-ボタンのコードはまだ書いていません。ボタンはエンドポイントにAJAXリクエストを送信するだけです-エンドポイントを構造化する方法を知る必要があります。
Adam Zerner 2015年

私の答えの@AdamZernerチェックアウト

回答:


147

DateTime.remove({}, callback) 空のオブジェクトはそれらすべてに一致します。


16
.remove()は非推奨になっていることに注意してください。Use deleteOne, deleteMany or bulkWrite instead.マングースで github.com/Automattic/mongoose/issues/6880
ペドロ・ルス

@PedroLuz私は1年間マングースを使用していません。回答を更新できてうれしいですが、最新バージョンのドキュメントにModel#removeが表示されます。あなたがリンクした議論は、マングースがそれらを非推奨にしたと言っていますが、マングースはそうではありません。「バージョンxyzより前」で明示できるように、非推奨リスト(または削除される予定のバージョン)に追加された特定のリリースはありますか?
chrisbajorin

2
削除は推奨されません
gazdagergo

DeprecationWarning:collection.removeは非推奨です。代わりに、deleteOne、deleteMany、またはbulkWriteを使用してください。@chrisbajorin
アンソニー

76

.remove()は非推奨です。代わりにdeleteManyを使用できます

DateTime.deleteMany({}, callback)


16

MongoDBでは、db.collection.remove()メソッドがコレクションからドキュメントを削除します。コレクションからすべてのドキュメントを削除したり、条件に一致するすべてのドキュメントを削除したり、操作を制限して1つのドキュメントのみを削除したりできます。

出典: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');
            }
        }
    );
};

このajaxdeleteメソッドをクライアント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です。私はangular-fullstackジェネレーターを使用しています。mongoコマンドを直接実行する方法がわかりません。私は常にMongooseを使用しています。
Adam Zerner 2015年

Expressを使用してルートを定義していますか?

私はAngularを使用しているので、ボタンはちょうど<button ng-click="clear()">Clear</button>です。
Adam Zerner 2015年

申し訳ありませんが、回答を更新します。すべてのコレクションを削除する必要があることに気づきませんでした-'。コードをmyで更新すると、削除プロセスの最後にページが再読み込みされます。

1

MongoDBシェルバージョン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()に引数を渡さないと、ツアーコレクション内のすべてのドキュメントが削除されます。

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.