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?

TIMEX
sumber

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.

Yusuf X
sumber
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.

diosney
sumber
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.

mtkopone
sumber
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.

José Pinto
sumber
1
Selama Anda tidak perlu melakukan pre 'remove'tindakan itu berfungsi dengan baik.
Daniel Kmak
32

Lakukan saja

FBFriendModel.remove().exec();
Sandro Munda
sumber
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();
Amol M Kulkarni
sumber
22

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

Kode yang saya gunakan

TeleBot.deleteMany({chatID: chatID}, function (err, _) {
                if (err) {
                    return console.log(err);
                }
            });
Samyak Jain
sumber
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
});
alexandru.topliceanu
sumber
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);
damphat
sumber
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.

bhavsac
sumber
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.
});
trusktr
sumber
9

Saya lebih suka notasi janji, di mana Anda perlu misalnya

Model.findOneAndRemove({_id:id})
    .then( doc => .... )
Simon H
sumber
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();
satyam kumar
sumber
6

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

FBFriendModel.remove({ id: 333}, function(err){});
David Losert
sumber
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;
    });
Doron Segal
sumber
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 }`
    })
});
Joshua Michael Wagoner
sumber
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"
        })
    }
KARTHIKEYAN.A
sumber
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
        })
      });
MEAbid
sumber
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'});
Renish Gotecha
sumber
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)
}))
Corysimmons
sumber
-2
db.collection.remove(<query>,
 {
  justOne: <boolean>,
  writeConcern: <document>
})
Rushabh.js
sumber
@ MR: Bagaimana bisa hanya tautan ketika tidak ada tautan dalam jawabannya ?? Juga periksa: Posting berkualitas rendah dan hanya jawaban kode
BDL
Sry misclick. Namun kualitasnya masih rendah.
MR