2013-02-25 11 views
14

अपडेट करने में असमर्थ मेरे पास एक अजीब मुद्दा है जो मुझे परेशान कर रहा है।mongoose मॉडल

var Model = new Schema({ 
    name: String, 
    variations: Array 
}); 

विविधताओं प्रविष्टि इस प्रकार है:: मैं एक मॉडल है

[ {code: '', price: '' }, {code: '', price: '' }] 

मैं एक नए क्षेत्र जोड़ने की जरूरत है - कहते हैं कि "रंग"। इसलिए मैं बैच अद्यतन करने के लिए यह कर रहा हूं:

Model.find().exec(function(err, products) { 
    if (!err) { 
     products.forEach(function(p) { 
      for(var i = p.variations.length - 1; i >= 0; i--) { 
       p.variations[i]['color'] = 'red'; 
       // This shows all existing variations 
       // with the new color feed - correct 
       console.log(p.variations[i]); 
      } 
      p.save(function(err) { 
       if (!err) { 
        console.log("Success"); 
       } else { 
        console.log(err); 
       } 
      }); 
     });  
    } 
}); 

हालांकि "रंग" क्षेत्र सेट नहीं है - अगर मैं के माध्यम से फिर से जाने के लिए और p.variations[i]['color'] = 'red'; लाइन बाहर टिप्पणी तो यह नहीं दिखाती है। मुझे यह पता लगाना प्रतीत नहीं होता कि यह ऐसा क्यों कर रहा है। मेरे पास एक ऑनसेव इवेंट है जो सही ढंग से ट्रिगर किया गया है, इसलिए यह बचत हो रहा है। मेरे पास विविधता संरचना पर कोई भी जांच नहीं है - यानी कोई कोड नहीं है जो केवल कोड और मूल्य की अनुमति देता है। मुझे कुछ याद आ रहा है लेकिन कुछ घंटों के बाद मैं विचारों से बाहर हो गया।

उत्तर

26

जब आप variations की तरह एक untyped Array क्षेत्र की सामग्री को संशोधित, आप नेवला है कि आप संशोधित दस्तावेज़ या बाद save() कॉल यह नहीं बचा लेगा पर markModified(path) फोन करके अपने मूल्य बदल दिया है सूचित करने के लिए की जरूरत है। See docs

for(var i = p.variations.length - 1; i >=0; i--) { 
    p.variations[i]['color'] = 'red'; 
    } 
    p.markModified('variations'); 
    p.save(function(err) { ... 
+0

यह भी सच है यदि आप किसी भी गहरे ऑब्जेक्ट्स को ढीले टाइप किए गए स्कीमा (mongoose.Schema.Types.Mixed) के साथ उपयोग करते हैं। और मोंगोस 4.5.8 के रूप में, उपर्युक्त विधि (मार्कमोडिफाइड) अभी भी ऐसा करने के लिए एक कार्यप्रणाली है। – SylonZero

3

आप set समारोह का उपयोग करने के लिए एक संपत्ति बदलना होगा। इसके पीछे तर्क यह है कि मॉन्गोज़ को डेटाबेस में सहेजने के लिए फ़ील्ड को संशोधित करने के लिए चिह्नित करना होता है।

for(var i = p.variations.length - 1; i >=0; i--) { 
    p.variations[i].set({"color":"red", "code":"herr"}); 
    // or 
    p.variations[i].set("color":"red"); 
    p.variations[i].set("code":"herr"); 
} 

एक वैकल्पिक फ़ील्ड का मान पुराना तरीका, बेलन सेटर जा रहा बिना परिवर्तन के हो सकता है, तो मैन्युअल रूप में चिह्नित के रूप में संशोधित: p.markModified('variations');

मेरी राय में आप हमेशा सेटर का उपयोग करना चाहिए, क्योंकि यह है अधिक पठनीय। आप पैरामीटर में अपने सभी परिवर्तनों को बस एक जेसन ऑब्जेक्ट पास कर सकते हैं और यह उन क्षेत्रों को सुरक्षित रूप से अपडेट करेगा जिन्हें आप वास्तव में बदलना चाहते हैं।

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