2012-11-12 10 views
31

मेरे पास एक अनुरोध है जिसमें शरीर में डेटा होता है और _idMongoose.js: कैसे बनाएं या अपडेट को कार्यान्वित करें?

कोड लागू करने का बेहतर तरीका क्या है जो अद्यतन होगा यदि _id के साथ रिकॉर्ड मौजूद है और कोई बनायेगा तो कोई भी नहीं है? मेरा कोड:

var obj = req.body; 
Model.findById(obj._id, function(err, data){ 
    if (!data){ 
     var model = new Model(obj) 
     model.save(function(err, data){ 
      res.send({method: 'create', error: err, data: data}) 
     }) 
    } else { 
     Model.findByIdAndUpdate(obj._id, obj, function(){ 
      res.send({method: 'update', error: err, data: data}) 
     }) 
    } 

मैं बस सोच रहा हूं कि ऐसा करने का बेहतर तरीका है।

उत्तर

59

आप ऐसा कर सकते हैं एक भी upsert साथ:

var obj = req.body; 
var id = obj._id; 
delete obj._id; 
if (id) { 
    Model.update({_id: id}, obj, {upsert: true}, function (err) {...}); 
} 

चेतावनी है कि अपने मॉडल के चूक और मिडलवेयर (यदि हो तो) लागू नहीं किया जाएगा है।

नेवला 4.x अद्यतन

अगर Upsert एक नया दस्तावेज़ बनाता है अब आप setDefaultOnInsert विकल्प का उपयोग कर सकते हैं भी डिफ़ॉल्ट लागू करने।

Model.update({_id: id}, obj, {upsert: true, setDefaultsOnInsert: true}, cb); 
+0

समस्या यह है कि "obj" _ id शामिल है, और अद्यतन के मामले में मैं यह पहले अद्यतन को निकालना होगा या मैं "मॉड _ id अनुमति नहीं पर" त्रुटि – WHITECOLOR

+1

@WHITECOLOR अच्छा बिंदु मिलता है। 'अपडेट' से पहले इसे हटाने के लिए कोड अपडेट किया गया। – JohnnyHK

+0

रगड़ है। मैं नव निर्मित (यदि यह अस्तित्व में नहीं है) आइटम को obj._id के बराबर _id रखना है, यदि ऑपरेशन बनाने से पहले obj से _id को निकालना है, तो mongo नया _id बना देगा। – WHITECOLOR

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^