2013-02-08 45 views
24

सहेजें मेरे पास मेरे मॉडल दस्तावेज़ में एक सरणी है। मैं उस सरणी के तत्वों को उस कुंजी के आधार पर हटाना चाहता हूं जो मैं प्रदान करता हूं और फिर MongoDB को अपडेट करता हूं। क्या यह संभव है?मोंगोस दस्तावेज़ में सरणी तत्व हटाएं और

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema; 

var favorite = new Schema({ 
    cn: String, 
    favorites: Array 
}); 

module.exports = mongoose.model('Favorite', favorite, 'favorite'); 

exports.deleteFavorite = function (req, res, next) { 
    if (req.params.callback !== null) { 
     res.contentType = 'application/javascript'; 
    } 
    Favorite.find({cn: req.params.name}, function (error, docs) { 
     var records = {'records': docs}; 
     if (error) { 
      process.stderr.write(error); 
     } 
     docs[0]._doc.favorites.remove({uid: req.params.deleteUid}); 

     Favorite.save(function (error, docs) { 
      var records = {'records': docs}; 
      if (error) { 
       process.stderr.write(error); 
      } 
      res.send(records); 

      return next(); 
     }); 
    }); 
}; 

अब तक यह दस्तावेज़ लेकिन निकालने पाता है और न ही काम करता है को बचाने:

यहाँ मेरी प्रयास है।

उत्तर

51

आप दस्तावेज़ लोड करने और कोड का उपयोग करके इसे संशोधित किए बिना सीधे मोंगोडीबी में भी अपडेट कर सकते हैं। सरणी से आइटम को हटाने के लिए $pull या $pullAll ऑपरेटरों का उपयोग करें:

Favorite.update({cn: req.params.name}, { $pullAll: {uid: [req.params.deleteUid] } }) 

http://docs.mongodb.org/manual/reference/operator/update/pullAll/

+2

यह प्रदर्शन के लिए बहुत बेहतर है। –

+1

बहुत उपयोगी, धन्यवाद। – Nate

+1

धन्यवाद ... – Dibish

5

चूंकि पसंदीदा एक सरणी है, इसलिए आपको इसे विभाजित करने और दस्तावेज़ को सहेजने की आवश्यकता है।

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema; 

var favorite = new Schema({ 
    cn: String, 
    favorites: Array 
}); 

module.exports = mongoose.model('Favorite', favorite); 

exports.deleteFavorite = function (req, res, next) { 
    if (req.params.callback !== null) { 
     res.contentType = 'application/javascript'; 
    } 
    // Changed to findOne instead of find to get a single document with the favorites. 
    Favorite.findOne({cn: req.params.name}, function (error, doc) { 
     if (error) { 
      res.send(null, 500); 
     } else if (doc) { 
      var records = {'records': doc}; 
      // find the delete uid in the favorites array 
      var idx = doc.favorites ? doc.favorites.indexOf(req.params.deleteUid) : -1; 
      // is it valid? 
      if (idx !== -1) { 
       // remove it from the array. 
       doc.favorites.splice(idx, 1); 
       // save the doc 
       doc.save(function(error) { 
        if (error) { 
         console.log(error); 
         res.send(null, 500); 
        } else { 
         // send the records 
         res.send(records); 
        } 
       }); 
       // stop here, otherwise 404 
       return; 
      } 
     } 
     // send 404 not found 
     res.send(null, 404); 
    }); 
}; 
+0

बहुत अच्छी प्रतिक्रिया के लिए धन्यवाद। – occasl

+3

यदि आप एक ही समय में 2 चीजों को हटाने का प्रयास करते हैं, तो वे दोनों सरणी प्राप्त कर सकते हैं, फिर इसे बदल सकते हैं, और सहेजे गए पहले परिवर्तन दूसरे द्वारा अतिरंजित हो जाते हैं। मैं इस तरह http://hackoverflow.com/questions/16959099/how-to-remove-array-element-in-mongodb की तरह sth के साथ जाना होगा। – Maximosaic

29

जाँच की जवाब काम करता है लेकिन MongooseJS नवीनतम में आधिकारिक तौर पर, आप पुल उपयोग करना चाहिए।

doc.subdocs.push({ _id: 4815162342 }) // added 
doc.subdocs.pull({ _id: 4815162342 }) // removed 

http://mongoosejs.com/docs/api.html#types_array_MongooseArray-pull

मैं सिर्फ इतना है कि ऊपर देख रहा था भी।

सही उत्तर के लिए डैनियल का जवाब देखें। काफी बेहतर।

0
keywords = [1,2,3,4]; 
doc.array.pull(1) //this remove one item from a array 
doc.array.pull(...keywords) // this remove multiple items in a array 

आप ... उपयोग करने के लिए आप अपने js फ़ाइल के शीर्ष पर 'use strict'; बुलाना चाहिए चाहते हैं; :)

1

यह मेरे लिए काम कर रहा है और वास्तव में बहुत उपयोगी है।

SubCategory.update({ _id: { $in: 
     arrOfSubCategory.map(function (obj) { 
      return mongoose.Types.ObjectId(obj); 
     }) 
    } }, 
    { 
     $pull: { 
      coupon: couponId, 
     } 
    }, { multi: true }, function (err, numberAffected) { 
     if(err) { 
      return callback({ 
       error:err 
      }) 
     } 
    }) 
}); 

मैं एक मॉडल है जो नाम SubCategory है है और मैं इस श्रेणी सरणी से कूपन निकालना चाहते हैं। मेरे पास श्रेणियों की एक श्रृंखला है इसलिए मैंने arrOfSubCategory का उपयोग किया है। तो मैं $in ऑपरेटर की सहायता से मानचित्र फ़ंक्शन के साथ इस सरणी से ऑब्जेक्ट की प्रत्येक सरणी लाता हूं।