Bagaimana cara menghapus dokumen menggunakan Node.js Mongoose?


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

Di atas sepertinya tidak berhasil. Catatan masih ada di sana.

Bisakah seseorang memperbaikinya?

Jawaban:


489

Jika Anda tidak ingin mengulanginya, coba FBFriendModel.find({ id:333 }).remove( callback );atauFBFriendModel.find({ id:333 }).remove().exec();

mongoose.model.findmengembalikan Query , yang memiliki removefungsi .

Pembaruan untuk Mongoose v5.5.3 - remove()sekarang tidak digunakan lagi. Gunakan deleteOne(), deleteMany()ataufindOneAndDelete() instead.


3
Apakah ini menjalankan middleware pre / post-remove? (beberapa metode metode memintas dokumen middleware dan saya tidak yakin apakah ini salah satunya, dokumen tidak jelas)
hunterloftis

12
Saya kira @hunterloftis sudah menemukan jawabannya, tetapi bagi siapa pun yang membaca jawabannya tidak, ini tidak akan menjalankan pre / post middleware pada dokumen individual.
numbers1311407

Ini tampaknya banyak dari jawaban lain yang disebutkan .exec()tetapi ini tidak sama sekali. Apakah .exec()diperlukan, apakah ada efek samping untuk menggunakannya atau tidak?
DanH

Dokumennya jelas (mungkin sudah diperbarui) bahwa ini memotong middleware - lihat bagian bawah mongoosejs.com/docs/middleware.html - jadi berhati-hatilah, menggunakan metode ini dapat menyebabkan masalah serius, sulit dilacak.
Jed Watson

1
jawaban bagus! apa argumen dari callback?
k88074

299

UPDATE: Versi luwak (5.5.3)

hapus () sudah usang dan Anda bisa menggunakan deleteOne (), deleteMany (), atau bulkWrite () sebagai gantinya.

Pada "mongoose": ">=2.7.1"Anda dapat menghapus dokumen secara langsung dengan .remove()metode daripada menemukan dokumen dan kemudian menghapusnya yang menurut saya lebih efisien dan mudah dirawat.

Lihat contoh:

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

MEMPERBARUI:

Pada luwak 3.8.1, ada beberapa metode yang memungkinkan Anda menghapus langsung dokumen, katakan:

  • remove
  • findByIdAndRemove
  • findOneAndRemove

Lihat dokumen API luwak untuk informasi lebih lanjut.


13
Seperti disebutkan dalam komentar lain untuk jawaban lain, ini memotong middleware yang didefinisikan pada skema, dan bisa sangat berbahaya. Jadi gunakan saja jika Anda memahami dampak yang akan terjadi. Untuk info lebih lanjut, lihat mongoosejs.com/docs/middleware.html
Jed Watson

2
Sebagai catatan, sampai sekarang saya selalu menggunakannya tanpa efek samping, tentu saja, saya tidak menggunakan middleware dalam proyek saya :)
diosney

8
remove(query)berpotensi mengosongkan seluruh koleksi Anda jika Anda tidak sengaja lulus query = {}. Karena itu saya lebih suka findOneAndRemove(query)jika saya hanya menghapus satu dokumen.
joeytwiddle

1
Perhatikan juga bahwa ini bukan mengembalikan kueri, jadi bukan janji. Anda tidak dapat melakukannyaModel.remove({ _id: 'whatever' }).exec().then(...)
David

48

docsadalah berbagai dokumen. jadi tidak ada mongooseModel.remove()metode.

Anda dapat mengulang dan menghapus setiap dokumen dalam array secara terpisah.

Atau - karena sepertinya Anda menemukan dokumen dengan (mungkin) id unik - findOnebukan menggunakan find.


5
Melihat jawaban ini mengasumsikan versi luwak yang agak lama, saya benar-benar tidak akan keberatan jika seseorang mengubah jawaban yang diterima.
mtkopone

Ini sebenarnya adalah salah satu cara terbaik untuk melakukannya karena ia benar memanggil middleware yang didefinisikan pada skema - lihat mongoosejs.com/docs/middleware.html . Anda hanya harus menggunakan metode lain jika Anda TIDAK menggunakan middleware dalam aplikasi Anda, dan kemudian dengan hati-hati.
Jed Watson

41

Ini bagi saya adalah yang terbaik pada versi 3.8.1:

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

Dan itu hanya membutuhkan satu panggilan DB. Gunakan ini mengingat Anda tidak melakukan removetindakan apa pun selain pencarian dan penghapusan.


1
Selama Anda tidak perlu melakukan pre 'remove'tindakan itu berfungsi dengan baik.
Daniel Kmak

32

Lakukan saja

FBFriendModel.remove().exec();

1
Sederhana dan efektif.
Rich Apodaca

1
Apakah ini mengembalikan Janji? Jika demikian, objek apa yang ditentukan saat Janji itu diselesaikan?
Kenny Worden

@KennyWorden pendekatan yang efektif untuk menemukan jawabannya -> mongoosejs.com/docs/api.html lalu cari apa yang Anda inginkan tetapi tambahkan '#' ke pencarian dalam halaman dengan browser Anda seperti pencarian di '#save' dan Anda Akan melihatnya mengembalikan janji.
Jason Sebring

3
Ini semacam jawaban berbahaya tanpa meletakkan kondisi yang ditentukan op di hapus ...
blak3r

29

mongoose.model.find()mengembalikan Objek Permintaan yang juga memiliki remove()fungsi.

Anda dapat menggunakan mongoose.model.findOne()juga, jika Anda ingin menghapus hanya satu dokumen unik.

Jika tidak, Anda dapat mengikuti pendekatan tradisional di mana Anda pertama kali mengambil dokumen dan kemudian menghapus.

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

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

Berikut ini cara-cara pada modelobjek yang dapat Anda lakukan salah satu dari yang berikut untuk menghapus dokumen:

yourModelObj.findOneAndRemove(conditions, options, callback)

yourModelObj.findByIdAndRemove(id, options, callback)

yourModelObj.remove(conditions, callback);

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

22

remove()telah ditinggalkan. Gunakan deleteOne(), deleteMany()ataubulkWrite() .

Kode yang saya gunakan

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

1
Jawaban ini sejujurnya membutuhkan lebih banyak upvotes. Ini ditempatkan secara tidak adil di bagian bawah laras (karena belum mendapatkan setengah dekade suara kuno), tetapi merupakan satu-satunya jawaban yang memecahkan masalah:(node:9132) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
Steven Ventimiglia

18

Untuk menggeneralisasi, Anda dapat menggunakan:

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

Cara lain untuk mencapai ini adalah:

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

18

Hati-hati dengan findOne dan hapus!

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

Kode di atas menghapus SEMUA pengguna yang bernama 'Alice' alih-alih yang pertama saja.

Omong-omong, saya lebih suka menghapus dokumen seperti ini:

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

Atau berikan panggilan balik dan hilangkan eksekutif ()

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


12

Jika Anda mencari hanya satu objek yang akan dihapus, Anda dapat menggunakan

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

    });

Dalam contoh ini, Mongoose akan dihapus berdasarkan pencocokan req.params.id.


Selamat datang di Stackoverflow. Jawaban Anda adalah duplikat dari beberapa jawaban di utas ini. Selain itu, Anda harus selalu memeriksa kesalahan dalam panggilan balik Anda.
VtoCorleone

9

.remove()bekerja seperti .find():

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

9

Saya lebih suka notasi janji, di mana Anda perlu misalnya

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

7

Untuk menghapus dokumen, saya lebih suka menggunakan Model.remove(conditions, [callback])

Silakan lihat dokumentasi API untuk dihapus: -

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

Untuk kasus ini, kode akan menjadi: -

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

Jika Anda ingin menghapus dokumen tanpa menunggu tanggapan dari MongoDB, jangan melewati callback, maka Anda perlu memanggil exec pada Query yang dikembalikan

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

6

Anda bisa menggunakan kueri langsung di dalam fungsi hapus, jadi:

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

6

Anda selalu dapat menggunakan fungsi bawaan Mongoose:

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

Pembaruan: .remove()disusutkan tetapi ini masih berfungsi untuk versi yang lebih lama

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

Model.remove sudah tidak digunakan lagi
Maxwell sc

2

menggunakan metode remove () yang dapat Anda hapus.

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

Model.remove sudah tidak digunakan lagi
Maxwell sc

1
Maxwell sc, buat permintaan edit lalu, dan koreksi. Saya tahu Anda baru mengenal SO, tetapi jauh lebih bermanfaat untuk memperbaikinya daripada mengomentari bahwa penyusutan. Mungkin Anda dapat menyarankan suntingan lain kali, atau mengedit sendiri, dan mengambil sedikit kepemilikan dari situasi ...
Joshua Michael Wagoner

1

Ini bekerja untuk saya, coba saja ini:

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.removesudah tidak digunakan lagi
Maxwell sc

1

Sesuai Jawaban Samyak Jain, saya menggunakan Async Tunggu

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

0

Saya sangat suka pola ini di aplikasi async / menunggu yang mampu Express / Mongoose:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.