Node.js Mongoose kullanarak belgeleri nasıl kaldırabilirim?


291
FBFriendModel.find({
    id: 333
}, function (err, docs) {
    docs.remove(); //Remove all the documents that match!
});

Yukarıdaki işe yaramıyor gibi görünüyor. Kayıtlar hala orada.

Birisi tamir edebilir mi?

Yanıtlar:


489

Eğer iterating gibi hissediyorum yoksa, deneyin FBFriendModel.find({ id:333 }).remove( callback );veyaFBFriendModel.find({ id:333 }).remove().exec();

mongoose.model.findBir döner sorgu bir sahiptir, removefonksiyon .

Mongoose v5.5.3 güncellemesi remove()artık kullanımdan kaldırıldı. Kullanım deleteOne(), deleteMany()yafindOneAndDelete() instead.


3
Bu işlem öncesi / kaldırma ara katman yazılımı çalıştırıyor mu? (Bazı model yöntemleri belge ara katman yazılımını atlar ve bunlardan biri olup olmadığından emin değilim, dokümanlar net değil)
hunterloftis

12
Sanırım @hunterloftis bunu çoktan çözdü, ama cevabı okuyan herkes için hayır, bu ayrı dokümanlar üzerinde ön / sonrası ara katman yazılımı çalıştırmaz.
Sayılar1311407

Diğer cevapların birçoğu bu görünüyor, .exec()ancak bu hiç de değil. .exec()Gerekli, kullanmanın yan etkileri var mı değil mi?
DanH

Belgeler, ara katman yazılımını atladığına dair açıktır (belki de güncellenmiştir) - mongoosejs.com/docs/middleware.html sayfasının altına bakın - bu nedenle bu yöntemi kullanmak ciddi, izlemesi zor sorunlara neden olabilir.
Jed Watson

1
mükemmel cevap! geri aramanın argümanları nelerdir?
k88074

299

GÜNCELLEME: Firavun faresi sürümü (5.5.3)

remove () kullanımdan kaldırılmıştır ve bunun yerine deleteOne (), deleteMany () veya bulkWrite () kullanabilirsiniz.

Olarak "mongoose": ">=2.7.1"belgeyi .remove()bulmak ve daha sonra bana daha verimli ve bakımı kolay gibi görünüyor kaldırmak yerine doğrudan yöntemi ile belgeyi kaldırabilirsiniz .

Örneğe bakın:

Model.remove({ _id: req.body.id }, function(err) {
    if (!err) {
            message.type = 'notification!';
    }
    else {
            message.type = 'error';
    }
});

GÜNCELLEME:

Firavun faresi olarak 3.8.1, bir belgeyi doğrudan kaldırmanıza olanak tanıyan çeşitli yöntemler vardır, örneğin:

  • remove
  • findByIdAndRemove
  • findOneAndRemove

Daha fazla bilgi için mongoose API belgelerine bakın .


13
Diğer cevapların diğer yorumlarında belirtildiği gibi, bu şemada tanımlanan ve gerçekten tehlikeli olabilecek ara katman yazılımlarını atlar. Bu yüzden, sadece etkisini anlayacaksanız kullanın. Daha fazla bilgi için, bkz. Mongoosejs.com/docs/middleware.html
Jed Watson

2
Sadece kayıt için, şimdiye kadar onları her zaman herhangi bir yan etkisi olmadan kullandım, elbette, projelerimde herhangi bir ara katman kullanmak zorunda
kalmadım

8
remove(query)yanlışlıkla geçerseniz koleksiyonunuzun tamamını boşaltabilir query = {}. Bu nedenle, findOneAndRemove(query)yalnızca bir belgeyi kaldırmayı tercih ederim .
joeytwiddle

1
Ayrıca bunun bir sorgu döndürmediğini, bu yüzden bir söz vermediğini unutmayın. Sen olamaz yapmakModel.remove({ _id: 'whatever' }).exec().then(...)
David

48

docsbir belge dizisidir. yani bir mongooseModel.remove()yöntemi yok.

Dizideki her bir belgeyi ayrı ayrı yineleyebilir ve kaldırabilirsiniz.

Eğer bir (muhtemelen) benzersiz id belgeleri buluyor gibi görünüyor beri - - Ya da kullanmak findOneyerine find.


5
Bu cevabın firavun faresinin oldukça eski bir versiyonunu varsayarken, kabul edilen cevabı değiştiren birine gerçekten itiraz etmem.
mtkopone

Bu aslında bunu yapmanın en iyi yollarından biridir, çünkü şemada tanımlanan ara katman yazılımını doğru bir şekilde çağırır - bkz. Mongoosejs.com/docs/middleware.html . Diğer yöntemleri yalnızca uygulamanızda ara katman yazılımı KULLANMADIĞINIZ ve sonra dikkatli bir şekilde kullanmanız gerekir.
Jed Watson

41

Bu benim için 3.8.1 sürümünden en iyisi:

MyModel.findOneAndRemove({field: 'newValue'}, function(err){...});

Ve sadece bir DB çağrısı gerektirir. removeArama ve kaldırma işlemiyle ilgili herhangi bir işlem yapmadığınız takdirde bunu kullanın .


1
İşlem yapmanız gerekmediği sürece pre 'remove'iyi çalışır.
Daniel Kmak

32

Basitçe yapın

FBFriendModel.remove().exec();

1
Basit ve etkili.
Zengin Apodaca

1
Bu bir söz veriyor mu? Öyleyse, Promise çözüldüğünde hangi nesne tanımlanır?
Kenny Worden

@KennyWorden cevabı bulmak için etkili bir yaklaşım -> mongoosejs.com/docs/api.html sonra ne istediğinizi arayın ancak tarayıcınızla '#save' arama gibi sayfa içi aramaya '#' ekleyin ve siz Bir söz verdiğini göreceğim.
Jason Sebring

3
Bu kaldırmada belirtilen op koymak olmadan tehlikeli bir cevaptır ...
blak3r

29

mongoose.model.find()Bir döner Sorgu Nesnesi ayrıca a sahiptirremove() .

Kullanabilirsiniz mongoose.model.findOne() yalnızca bir benzersiz bir belge kaldırmak istiyorsanız, de.

Bunun dışında, ilk önce belgeyi alıp daha sonra kaldırdığınız geleneksel yaklaşımı da takip edebilirsiniz.

yourModelObj.findById(id, function (err, doc) {
    if (err) {
        // handle error
    }

    doc.remove(callback); //Removes the document
})

modelBelgeleri kaldırmak için aşağıdakilerden herhangi birini yapabileceğiniz nesneler üzerindeki yollar şunlardır :

yourModelObj.findOneAndRemove(conditions, options, callback)

yourModelObj.findByIdAndRemove(id, options, callback)

yourModelObj.remove(conditions, callback);

var query = Comment.remove({ _id: id });
query.exec();

22

remove(), kullanımdan kaldırıldı. Kullanım deleteOne(), deleteMany()yabulkWrite() .

Kullandığım kod

TeleBot.deleteMany({chatID: chatID}, function (err, _) {
                if (err) {
                    return console.log(err);
                }
            });

1
Bu cevabın dürüstçe daha fazla oy kullanması gerekiyor. Haksız bir şekilde namlunun dibine yerleştirildi (çünkü yarım on yıllık antika oylar almıyor), ancak şu sorunu çözen tek cevap:(node:9132) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
Steven Ventimiglia

18

Genelleştirmek için şunları kullanabilirsiniz:

SomeModel.find( $where, function(err,docs){
  if (err) return console.log(err);
  if (!docs || !Array.isArray(docs) || docs.length === 0) 
    return console.log('no docs found');
  docs.forEach( function (doc) {
    doc.remove();
  });
});

Bunu başarmanın başka bir yolu:

SomeModel.collection.remove( function (err) {
  if (err) throw err;
  // collection is now empty but not deleted
});

18

FindOne ile dikkatli olun ve çıkarın!

  User.findOne({name: 'Alice'}).remove().exec();

Yukarıdaki kod , yalnızca ilk kullanıcı yerine 'Alice' adlı TÜM kullanıcıları kaldırır .

Bu arada, böyle belgeleri kaldırmayı tercih ederim:

  User.remove({...}).exec();

Veya geri arama yapın ve exec ()

  User.remove({...}, callback);


12

Kaldırılacak yalnızca bir nesne arıyorsanız,

Person.findOne({_id: req.params.id}, function (error, person){
        console.log("This object will get deleted " + person);
        person.remove();

    });

Bu örnekte, Mongoose eşleşen req.params.id dosyasına göre silinecektir.


Stackoverflow'a hoş geldiniz. Cevabınız bu ileti dizisindeki birden çok yanıtın kopyası. Ayrıca, geri aramalarınızda her zaman hata olup olmadığını kontrol etmelisiniz.
VtoCorleone

9

.remove()gibi çalışır .find():

MyModel.remove({search: criteria}, function() {
    // removed.
});

9

İhtiyacınız olan yerlerde söz gösterimini tercih ederim;

Model.findOneAndRemove({_id:id})
    .then( doc => .... )

7

Belgeyi kaldırmak için şunu kullanmayı tercih ederim Model.remove(conditions, [callback])

Kaldırmak için lütfen API belgelerine bakın: -

http://mongoosejs.com/docs/api.html#model_Model.remove

Bu durumda kod şöyle olacaktır: -

FBFriendModel.remove({ id : 333 }, function(err, callback){
console.log(‘Do Stuff’);
})

MongoDB'den yanıt beklemeden belgeleri kaldırmak istiyorsanız, geri arama yapmayın, sonra döndürülen Sorgu'da exec çağırmanız gerekir

var removeQuery = FBFriendModel.remove({id : 333 });
removeQuery.exec();

6

Sorguyu doğrudan kaldırma işlevinde kullanabilirsiniz, böylece:

FBFriendModel.remove({ id: 333}, function(err){});

6

Mongoose yerleşik işlevini her zaman kullanabilirsiniz:

var id = req.params.friendId; //here you pass the id
    FBFriendModel
   .findByIdAndRemove(id)
   .exec()
   .then(function(doc) {
       return doc;
    }).catch(function(error) {
       throw error;
    });

5

Güncelleme: .remove()amortismana tabi tutulur, ancak bu eski sürümler için de geçerlidir

YourSchema.remove({
    foo: req.params.foo
}, function(err, _) {
    if (err) return res.send(err)
    res.json({
        message: `deleted ${ req.params.foo }`
    })
});

Model.remove kullanımdan kaldırıldı
Maxwell sc

2

remove () yöntemini kullanarak kaldırabilirsiniz.

getLogout(data){
        return this.sessionModel
        .remove({session_id: data.sid})
        .exec()
        .then(data =>{
            return "signup successfully"
        })
    }

Model.remove kullanımdan kaldırıldı
Maxwell sc

1
Maxwell sc, daha sonra bir düzenleme isteği yapın ve düzeltin. SO için yeni olduğunuzu biliyorum, ancak amortismana tabi olduğunu yorumlamaktan çok daha yararlıdır. Belki bir dahaki sefere bir düzenleme önerebilir veya kendiniz bir düzenleme yapabilir ve durumun biraz sahiplenebilirsiniz ...
Joshua Michael Waggoner

1

Bu benim için çalıştı, sadece şunu dene:

const id = req.params.id;
      YourSchema
      .remove({_id: id})
      .exec()
      .then(result => {
        res.status(200).json({
          message: 'deleted',
          request: {
            type: 'POST',
            url: 'http://localhost:3000/yourroutes/'
          }
        })
      })
      .catch(err => {
        res.status(500).json({
          error: err
        })
      });

Model.removekullanımdan kaldırıldı
Maxwell sc

1

Samyak Jain'in Cevabına göre Async Await kullanıyorum

let isDelete = await MODEL_NAME.deleteMany({_id:'YOUR_ID', name:'YOUR_NAME'});

0

Async / await yetenekli Express / Mongoose uygulamalarındaki bu deseni gerçekten seviyorum :

app.delete('/:idToDelete', asyncHandler(async (req, res) => {
  const deletedItem = await YourModel
    .findByIdAndDelete(req.params.idToDelete) // This method is the nice method for deleting
    .catch(err => res.status(400).send(err.message))

  res.status(200).send(deletedItem)
}))

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.