ฉันจะลบเอกสารโดยใช้ Node.js Mongoose ได้อย่างไร


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

ดูเหมือนว่าข้างต้นจะไม่ทำงาน บันทึกยังคงอยู่ที่นั่น

บางคนสามารถแก้ไขได้

คำตอบ:


489

หากคุณไม่รู้สึกอยากลองFBFriendModel.find({ id:333 }).remove( callback );หรือFBFriendModel.find({ id:333 }).remove().exec();

mongoose.model.findส่งกลับแบบสอบถามซึ่งมีฟังก์ชั่นremove

อัพเดตสำหรับ Mongoose v5.5.3 - ได้remove()ถูกคัดค้านแล้ว การใช้งานdeleteOne(), deleteMany()หรือfindOneAndDelete() instead.


3
สิ่งนี้เรียกใช้มิดเดิลแวร์ล่วงหน้า / หลังการลบหรือไม่ (วิธีการแบบจำลองบางอย่างข้ามมิดเดิลแวร์ของเอกสารและฉันไม่แน่ใจว่านี่เป็นหนึ่งในนั้นหรือไม่เอกสารไม่ชัดเจน)
hunterloftis

12
ฉันคิดว่า @hunterloftis ได้คิดเรื่องนี้แล้ว แต่สำหรับคนอื่นที่อ่านคำตอบคือไม่สิ่งนี้จะไม่เรียกใช้มิดเดิลแวร์ล่วงหน้า / โพสต์บนเอกสารส่วนตัว
numbers1311407

ดูเหมือนว่าจะมีคำตอบอื่น ๆ อีกมากมายที่พูดถึง.exec()แต่ก็ไม่ได้เป็นเช่นนั้น เป็น.exec()สิ่งจำเป็นที่จะมีผลข้างเคียงที่มีการใช้มันหรือไม่?
DanH

เอกสารมีความชัดเจน (บางทีพวกเขาได้รับการปรับปรุงแล้ว) ว่านี่เป็นการข้ามมิดเดิลแวร์ - ดูที่ด้านล่างของmongoosejs.com/docs/middleware.html - ดังนั้นควรระมัดระวังการใช้วิธีนี้อาจทำให้เกิดปัญหาร้ายแรงและติดตามปัญหาได้ยาก
Jed Watson

1
คำตอบที่ดี! อะไรคือข้อโต้แย้งของการโทรกลับ
k88074

299

ปรับปรุง: รุ่นพังพอน (5.5.3)

ลบ () เลิกใช้แล้วและคุณสามารถใช้ deleteOne (), deleteMany () หรือ bulkWrite () แทน

ในขณะที่"mongoose": ">=2.7.1"คุณสามารถลบเอกสารโดยตรงด้วย.remove()วิธีการมากกว่าการค้นหาเอกสารแล้วลบมันซึ่งดูเหมือนว่าฉันมีประสิทธิภาพมากขึ้นและง่ายต่อการบำรุงรักษา

ดูตัวอย่าง:

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

UPDATE:

ในฐานะพังพอน3.8.1มีหลายวิธีที่ให้คุณลบเอกสารได้โดยตรงพูดว่า:

  • remove
  • findByIdAndRemove
  • findOneAndRemove

อ้างถึงเอกสาร API พังพอนสำหรับข้อมูลเพิ่มเติม


13
ดังที่ระบุไว้ในความคิดเห็นอื่น ๆ สำหรับคำตอบอื่น ๆ การข้ามมิดเดิลแวร์ที่กำหนดไว้ในสคีมาและอาจเป็นอันตรายจริงๆ ดังนั้นใช้มันเฉพาะเมื่อคุณเข้าใจถึงผลกระทบที่จะมี สำหรับข้อมูลเพิ่มเติมโปรดดูmongoosejs.com/docs/middleware.html
Jed Watson

2
เพียงแค่สำหรับบันทึกจนตอนนี้ฉันมักจะได้ใช้พวกเขาโดยไม่มีผลข้างเคียงใด ๆ แน่นอนผมไม่ได้ใช้ตัวกลางใด ๆ ในโครงการของฉัน :)
diosney

8
remove(query)อาจจะล้างคอลเลกชันทั้งหมดของคุณquery = {}ถ้าคุณตั้งใจผ่าน ด้วยเหตุนี้ฉันจึงต้องการfindOneAndRemove(query)ถ้าฉันลบเอกสารเพียงฉบับเดียวเท่านั้น
joeytwiddle

1
โปรดทราบว่านี่ไม่ใช่การส่งคืนเคียวรีดังนั้นจึงไม่มีคำสัญญา คุณไม่สามารถทำได้Model.remove({ _id: 'whatever' }).exec().then(...)
เดวิด

48

docsคืออาร์เรย์ของเอกสาร ดังนั้นจึงไม่มีmongooseModel.remove()วิธี

คุณสามารถทำซ้ำและลบแต่ละเอกสารในอาร์เรย์แยกต่างหาก

หรือ - เพราะมันดูเหมือนว่าคุณกำลังมองหาเอกสารด้วย (อาจจะ) ID ไม่ซ้ำกัน - ใช้แทนfindOnefind


5
การเห็นว่าคำตอบนี้ถือว่าเป็นรุ่นพังพอนที่ค่อนข้างเก่าฉันจะไม่คัดค้านคนที่เปลี่ยนคำตอบที่ยอมรับ
mtkopone

นี้เป็นจริงหนึ่งในวิธีที่ดีที่สุดที่จะทำมันเพราะมันอย่างถูกต้องจะเรียก Middleware กำหนดไว้ในสคี - ดูmongoosejs.com/docs/middleware.html คุณควรใช้วิธีอื่นถ้าคุณไม่ได้ใช้มิดเดิลแวร์ในแอปพลิเคชันของคุณและด้วยความระมัดระวัง
Jed Watson

41

สิ่งนี้สำหรับฉันดีที่สุดของเวอร์ชั่น 3.8.1:

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

และมันต้องการการเรียก DB เดียวเท่านั้น ใช้สิ่งนี้เนื่องจากคุณไม่ได้ดำเนินการใด ๆremoveกับการค้นหาและการลบ


1
ตราบใดที่คุณไม่จำเป็นต้องดำเนินpre 'remove'การใด ๆ มันก็ใช้ได้ดี
Daniel Kmak

32

ทำได้ง่ายๆ

FBFriendModel.remove().exec();

1
ง่ายและมีประสิทธิภาพ
Rich Apodaca

1
สิ่งนี้ส่งคืนสัญญาหรือไม่? ถ้าเป็นเช่นนั้นวัตถุใดที่ถูกกำหนดเมื่อสัญญาได้รับการแก้ไข
Kenny Worden

@KennyWorden วิธีการที่มีประสิทธิภาพในการค้นหาคำตอบ -> mongoosejs.com/docs/api.htmlจากนั้นค้นหาสิ่งที่คุณต้องการ แต่ผนวก '#' ลงในการค้นหาในหน้าเว็บด้วยเบราว์เซอร์ของคุณเช่นการค้นหา '#save' และคุณ จะเห็นว่ามันคืนสัญญา
Jason Sebring

3
นี่คือชนิดของคำตอบที่เป็นอันตรายโดยไม่ต้องใส่เงื่อนไข op ที่ระบุไว้ในการเอาออก ...
blak3r

29

mongoose.model.find()ส่งกลับวัตถุแบบสอบถามซึ่งยังมีremove()ฟังก์ชั่น

คุณสามารถใช้ได้ mongoose.model.findOne()เช่นกันหากคุณต้องการลบเอกสารที่ไม่ซ้ำกันเพียงฉบับเดียว

มิฉะนั้นคุณสามารถทำตามวิธีการดั้งเดิมเช่นเดียวกับที่คุณเรียกเอกสารก่อนแล้วจึงลบ

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

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

ต่อไปนี้เป็นวิธีบนmodelวัตถุที่คุณสามารถทำสิ่งใดสิ่งหนึ่งต่อไปนี้เพื่อลบเอกสาร:

yourModelObj.findOneAndRemove(conditions, options, callback)

yourModelObj.findByIdAndRemove(id, options, callback)

yourModelObj.remove(conditions, callback);

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

22

remove()เลิกใช้แล้ว การใช้งานdeleteOne(), deleteMany()หรือbulkWrite()หรือ

รหัสที่ฉันใช้

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

1
คำตอบนี้ต้องการ upvotes มากขึ้นโดยสุจริต วางไว้อย่างไม่เป็นธรรมที่ด้านล่างของถัง (เพราะมันไม่ได้รับการลงมติครึ่งทศวรรษ) แต่เป็นคำตอบเดียวที่แก้ปัญหาของ:(node:9132) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
สตีเวน Ventimiglia

18

ในการพูดคุยทั่วไปคุณสามารถใช้:

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

อีกวิธีหนึ่งในการบรรลุเป้าหมายนี้คือ:

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

18

ระวังด้วย findOne แล้วลบออก!

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

รหัสด้านบนจะลบผู้ใช้ทั้งหมดที่ชื่อ 'อลิซ' แทนที่จะเป็นคนแรกเท่านั้น

อย่างไรก็ตามฉันต้องการลบเอกสารเช่นนี้:

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

หรือจัดให้มีการโทรกลับและละเว้น exec ()

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


12

หากคุณกำลังมองหาวัตถุเดียวที่จะลบคุณสามารถใช้

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

    });

ในตัวอย่างนี้ Mongoose จะลบตาม req.params.id ที่ตรงกัน


ยินดีต้อนรับสู่ Stackoverflow คำตอบของคุณซ้ำซ้อนกับคำตอบหลายข้อในชุดข้อความนี้ นอกจากนี้คุณควรตรวจสอบข้อผิดพลาดในการโทรกลับ
VtoCorleone


9

ฉันชอบสัญกรณ์สัญญาที่คุณต้องการเช่น

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

7

สำหรับการลบเอกสารฉันชอบที่จะใช้ Model.remove(conditions, [callback])

โปรดอ้างอิงเอกสาร API สำหรับการลบ: -

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

ในกรณีนี้รหัสจะเป็น: -

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

หากคุณต้องการลบเอกสารโดยไม่รอการตอบกลับจาก MongoDB อย่าผ่านการเรียกกลับจากนั้นคุณจะต้องเรียกใช้ exec ใน Query ที่ส่งคืน

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

6

คุณสามารถใช้แบบสอบถามโดยตรงภายในฟังก์ชันลบดังนั้น:

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

6

คุณสามารถใช้ฟังก์ชันในตัวของ 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

อัปเดต: .remove()เลิกใช้แล้ว แต่ยังใช้งานได้กับเวอร์ชันเก่ากว่า

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

Model.remove เลิกใช้แล้ว
Maxwell sc

2

การใช้ remove () วิธีการที่คุณสามารถลบได้

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

Model.remove เลิกใช้แล้ว
Maxwell sc

1
Maxwell sc สร้างคำขอแก้ไขแล้วและแก้ไข ฉันรู้ว่าคุณยังใหม่กับ SO แต่มันมีประโยชน์มากกว่าที่จะแก้ไขมันมากกว่าที่จะแสดงความคิดเห็นว่ามันมีค่าเสื่อมราคา บางทีคุณอาจแนะนำการแก้ไขในครั้งต่อไปหรือแก้ไขด้วยตัวคุณเองและเป็นเจ้าของสถานการณ์เล็กน้อย ...
Joshua Michael Wagoner

1

สิ่งนี้ใช้ได้ผลสำหรับฉันลองทำสิ่งนี้:

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.removeเลิกใช้แล้ว
Maxwell sc



-2
db.collection.remove(<query>,
 {
  justOne: <boolean>,
  writeConcern: <document>
})

@MR: มันจะเชื่อมโยงได้อย่างไรเมื่อไม่มีลิงก์ในคำตอบ ?? ตรวจสอบด้วย: โพสต์ที่มีคุณภาพต่ำและคำตอบของโค้ดเท่านั้น
BDL

Sry misclick แต่ก็ยังมีคุณภาพต่ำ
MR
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.