मैं 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
क्या यह पूर्व / पोस्ट-मिडिलवेयर को हटाता है? (कुछ मॉडल विधियाँ दस्तावेज़ मिडलवेयर को बायपास करती हैं और मुझे यकीन नहीं है कि यह उनमें से एक है, डॉक्स अस्पष्ट हैं)
हंटरलेफ्टिस

12
मुझे लगता है कि @hunterloftis ने पहले ही इसका पता लगा लिया है, लेकिन किसी और के जवाब को पढ़ने के लिए नहीं, यह व्यक्तिगत डॉक्स पर पूर्व / पोस्ट मिडलवेयर नहीं चलेगा।
1311407

ऐसा लगता है कि कई अन्य जवाबों का उल्लेख है .exec()लेकिन यह बिल्कुल नहीं है। है .exec()की जरूरत है, इसे का उपयोग करने या नहीं करने वहाँ दुष्प्रभाव होते हैं?
दानह

डॉक्स स्पष्ट हैं (हो सकता है कि उन्हें अपडेट किया गया हो) जो कि मिडलवेयर को बायपास करता है - mongoosejs.com/docs/middleware.html के नीचे देखें - इसलिए सावधान रहें, इस पद्धति का उपयोग करके मुद्दों को ट्रैक करने के लिए गंभीर, कठिन हो सकता है।
जेड वाटसन

1
बहुत बढ़िया जवाब! कॉलबैक के तर्क क्या हैं?
k88074

299

अद्यतन: Mongoose संस्करण (5.5.3)

हटाने () को हटा दिया गया है और आप इसके बजाय deleteOne (), deleteMany (), या बल्कव्रीट () का उपयोग कर सकते हैं।

जैसा कि "mongoose": ">=2.7.1"आप दस्तावेज़ को .remove()खोजने के बजाय दस्तावेज़ को सीधे विधि से हटा सकते हैं और फिर इसे हटा सकते हैं जो मुझे अधिक कुशल और बनाए रखने में आसान लगता है।

उदाहरण देखें:

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

अपडेट करें:

मानगो के अनुसार 3.8.1, कई तरीके हैं जो आपको सीधे एक दस्तावेज़ को हटाने की अनुमति देते हैं, कहते हैं:

  • remove
  • findByIdAndRemove
  • findOneAndRemove

अधिक जानकारी के लिए एपीआई डॉक्स का संदर्भ लें ।


13
जैसा कि अन्य टिप्पणियों में अन्य उत्तरों में उल्लेख किया गया है, यह मिडिलवेयर को बायपास करता है जो स्कीमा पर परिभाषित किया गया है, और वास्तव में खतरनाक हो सकता है। तो केवल इसका उपयोग करें यदि आप उस प्रभाव को समझते हैं जो होगा। अधिक जानकारी के लिए, mongoosejs.com/docs/middleware.html
जेड वाटसन

2
बस रिकॉर्ड के लिए, अब तक मैंने हमेशा उन्हें बिना किसी साइड इफेक्ट के इस्तेमाल किया है, निश्चित रूप से, मैंने अपनी परियोजनाओं में किसी भी मिडलवेयर का उपयोग नहीं किया था :)
डायोसनी

8
remove(query)यदि आप गलती से पास हो जाते हैं तो संभवतः अपना पूरा संग्रह खाली कर सकते हैं query = {}findOneAndRemove(query)यदि मैं केवल एक दस्तावेज़ निकाल रहा हूँ तो उस कारण से मुझे पसंद है ।
joeytwiddle

1
यह भी ध्यान दें कि यह एक क्वेरी नहीं लौटा रहा है, इसलिए न ही एक वादा। आप ऐसा नहीं कर सकतेModel.remove({ _id: 'whatever' }).exec().then(...)
डेविड

48

docsदस्तावेजों की एक सरणी है। तो यह एक mongooseModel.remove()विधि नहीं है ।

आप सरणी में प्रत्येक दस्तावेज़ को अलग से पुनरावृत्त और निकाल सकते हैं।

या - चूंकि ऐसा लगता है कि आप एक (शायद) अद्वितीय आईडी द्वारा दस्तावेजों को ढूंढ रहे हैं - findOneइसके बजाय उपयोग करें find


5
इस उत्तर को मानसून के पुराने संस्करण के रूप में देखते हुए, मैं वास्तव में स्वीकृत उत्तर को बदलने वाले किसी व्यक्ति पर आपत्ति नहीं करूंगा।
mtkopone

यह वास्तव में इसे करने के सर्वोत्तम तरीकों में से एक है क्योंकि यह स्कीमा पर परिभाषित मिडलवेयर को सही ढंग से आमंत्रित करता है - mongoosejs.com/docs/middleware.html देखें । यदि आप अपने आवेदन में मिडलवेयर का उपयोग नहीं कर रहे हैं, और फिर सावधानी के साथ आपको अन्य विधियों का उपयोग करना चाहिए।
जेड वॉटसन

41

मेरे लिए यह संस्करण 3.8.1 के रूप में सबसे अच्छा है:

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

और इसके लिए केवल एक डीबी कॉल की आवश्यकता होती है। इस दिए का उपयोग करें कि आप removeखोज और निष्कासन के लिए कोई क्रिया नहीं करते हैं ।


1
जब तक आपको कार्य करने की आवश्यकता नहीं है तब तक pre 'remove'यह ठीक काम करता है।
डेनियल Kmak

32

बस करो

FBFriendModel.remove().exec();

1
सरल और प्रभावी।
रिच अपाकाका

1
क्या यह एक वादा वापस करता है? यदि हां, तो प्रॉमिस हल होने पर कौन सी वस्तु परिभाषित की गई है?
केनी वर्डेन

उत्तर खोजने के लिए @KennyWorden एक प्रभावी तरीका -> mongoosejs.com/docs/api.html फिर जो आप चाहते हैं उसे खोजें, लेकिन अपने ब्राउज़र के साथ इन-पेज खोज में '#' को प्रीपेड करें जैसे कि '# बटन' पर सर्च करें और आप 'यह देखेंगे कि यह एक वादा लौटाता है।
जेसन सेब्रिंग

3
यह एक खतरनाक उत्तर की स्थिति को हटाने में निर्दिष्ट किए बिना है ...
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
इस जवाब को ईमानदारी से और अधिक बढ़ाने की जरूरत है। इसे बैरल के निचले हिस्से में गलत तरीके से रखा गया है (क्योंकि यह एक-दशक से पुराने मतों को प्राप्त नहीं कर रहा है), लेकिन एकमात्र उत्तर है जो इस मुद्दे को हल करता है:(node:9132) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
स्टीवन वेंटिमिग्लिया

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

या कॉलबैक प्रदान करें और निष्पादन को छोड़ें ()

  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 में आपका स्वागत है। आपका उत्तर इस थ्रेड में कई उत्तरों का एक डुप्लिकेट है। इसके अलावा, आपको हमेशा अपने कॉलबैक में त्रुटि की जांच करनी चाहिए।
वीटकोर्लोन

9

.remove()जैसे काम करता है .find():

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

9

मैं वादा नोटेशन पसंद करता हूं, जहां आपको जरूरत है जैसे

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

7

दस्तावेज़ को हटाने के लिए, मैं उपयोग करना पसंद करता हूं Model.remove(conditions, [callback])

कृपया निकालें के लिए एपीआई प्रलेखन देखें: -

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

इस मामले के लिए, कोड होगा: -

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

यदि आप MongoDB की प्रतिक्रिया की प्रतीक्षा किए बिना दस्तावेज़ निकालना चाहते हैं, तो कॉलबैक पास न करें, तो आपको रिटर्न क्वेरी पर निष्पादन को कॉल करने की आवश्यकता है

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 पदावनत है
मैक्सवेल sc

2

हटाने () विधि का उपयोग करके आप निकालने में सक्षम हो सकते हैं।

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

Model.remove पदावनत है
मैक्सवेल sc

1
मैक्सवेल sc, फिर एक संपादन अनुरोध करें, और सही करें। मुझे पता है कि आप एसओ के लिए नए हैं, लेकिन यह टिप्पणी करने की तुलना में इसे ठीक करने के लिए अधिक उपयोगी है। हो सकता है कि आप अगली बार किसी को संपादित करने का सुझाव दे सकते हैं, या खुद को संपादित कर सकते हैं, और स्थिति का थोड़ा स्वामित्व ले सकते हैं ...
जोशुआ माइकल वैगनर

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पदावनत है
मैक्सवेल sc

1

सम्यक जैन के उत्तर के अनुसार, मैं Async Await का उपयोग करता हूं

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

0

मैं वास्तव में इस पैटर्न को async में पसंद करता हूं / सक्षम एक्सप्रेस / 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)
}))

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

@MR: जब उत्तर में कोई लिंक नहीं है तो यह केवल लिंक कैसे हो सकता है ?? यह भी देखें: निम्न गुणवत्ता वाले पोस्ट और कोड केवल उत्तर देते हैं
BDL

साइरी मिसिक्लिक। लेकिन अभी भी एक कम गुणवत्ता है।
MR
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.