Mongoose ile bir koleksiyondaki tüm belgeleri nasıl kaldırabilirsiniz?


91

Nasıl yapılacağını biliyorum...

  • Tek bir belgeyi kaldırın.
  • Koleksiyonun kendisini kaldırın.
  • Mongo ile koleksiyondaki tüm belgeleri kaldırın.

Ancak Mongoose ile tüm belgeleri koleksiyondan nasıl çıkaracağımı bilmiyorum. Bunu kullanıcı bir düğmeyi tıkladığında yapmak istiyorum. Bazı uç noktalara bir AJAX isteği göndermem ve kaldırma işlemini uç noktaya yaptırmam gerektiğini varsayıyorum, ancak son noktada kaldırma işlemini nasıl yapacağımı bilmiyorum.

Örneğimde, bir Datetimekoleksiyonum var ve kullanıcı bir düğmeyi tıkladığında tüm belgeleri kaldırmak istiyorum.

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 silme ile bir silme rotası oluşturmanız gerekir. bana html kodu düğmesini göster.

şimdi sana yardım edebilirim .. bir saniye, kodu yapacağım.

bana html düğmesini göster lütfen.

@MrBearAndBear - Düğmenin kodunu henüz yazmadım. Düğme sadece uç noktaya bir AJAX isteği gönderir - sadece uç noktayı nasıl yapılandıracağımı bilmem gerekiyor.
Adam Zerner

cevabıma bak @AdamZerner

Yanıtlar:


146

DateTime.remove({}, callback) Boş nesne hepsiyle eşleşecek.


16
Lütfen .remove () uygulamasının kullanımdan kaldırıldığını unutmayın. Use deleteOne, deleteMany or bulkWrite instead.in firavun faresi github.com/Automattic/mongoose/issues/6880
Pedro Luz

@PedroLuz Mongoose'u bir yıldır kullanmadım. Cevabımı güncellemekten memnunum, ancak en son sürümün belgelerinde Model # kaldırmayı görmeye devam ediyorum. Bağlandığınız tartışma, mongo'nun onları reddettiğini söylüyor, ancak firavun faresi bunu yapmadı. Kullanımdan kaldırma listesine (veya kaldırılması beklenen bir sürüm) eklendiği, böylece "xyz sürümünden önceki sürümümde" açıkça belirtilebilecek belirli bir yayın var mı?
chrisbajorin

2
kaldırma kullanımdan kaldırıldı
gazdagergo

DeprecationWarning: collection.remove kullanımdan kaldırıldı. Bunun yerine deleteOne, deleteMany veya bulkWrite kullanın. @chrisbajorin
Anthony

71

.remove()kullanımdan kaldırıldı. bunun yerine deleteMany kullanabiliriz

DateTime.deleteMany({}, callback).


15

MongoDB'de, db.collection.remove () yöntemi, bir koleksiyondaki belgeleri kaldırır. Bir koleksiyondaki tüm belgeleri kaldırabilir, bir koşulla eşleşen tüm belgeleri kaldırabilir veya işlemi yalnızca tek bir belgeyi kaldıracak şekilde sınırlayabilirsiniz.

Kaynak: Mongodb .

Mongo sheel kullanıyorsanız, yapmanız gerekenler:

db.Datetime.remove({})

Senin durumunda şunlara ihtiyacın var:

Bana sil düğmesini göstermediniz, bu nedenle bu düğme yalnızca bir örnek:

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

Denetleyiciyi şu şekilde değiştirin:

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

Bu ajax silme yöntemini istemci js dosyanıza ekleyin:

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

Bunu Mongoose ile yapmanın bir yolu var mı? Yığımım Angular / Express / Node / Mongo. Açısal dolu yığın oluşturucuyu kullanıyorum . Doğrudan mongo komutlarını nasıl çalıştıracağımdan emin değilim, her zaman Mongoose'u kullandım.
Adam Zerner

Rotalarınızı tanımlamak için ekspres kullanıyor musunuz?

Açısal kullanıyorum, bu yüzden düğme sadece <button ng-click="clear()">Clear</button>.
Adam Zerner

üzgünüm, cevabımı güncelledim .. tüm koleksiyonları silmek istediğinizi fark etmedim - '. Kodunuzu, silme işleminin sonunda benim ile güncellerseniz, sayfa yeniden yüklenecektir.

0

MongoDB kabuk sürümü v4.2.6
Düğüm v14.2.0

Bir Tur Modeliniz olduğunu varsayarsak: 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;

Artık tüm turları MongoDB'nizden silmek istiyorsunuz, ayrıca uzak kümeye bağlanmak için bağlantı kodu da veriyorum. DeleteMany () kullandım, deleteMany () öğesine herhangi bir bağımsız değişken iletmezseniz, Tur koleksiyonundaki tüm belgeleri silecektir.

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);
  }
};
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.