मैं इसे इस तरह नहीं लिखूंगा, लेकिन मैं आपको बताऊंगा कि आपका कोड क्यों विफल हो रहा है।
समस्या आपके $set ब्लॉक की है
आप विशेष रूप से पास किए गए अद्यतन ऑब्जेक्ट के लिए मान सेट करना चुन रहे हैं। यदि मान undefined
है आप मोंगो को null
. पर सेट करने के लिए मजबूर कर रहे हैं ।
ये रही समस्या
उदाहरण, डीबी में:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"),
"name" : "firstTest",
"nickname": "jack",
"__v" : 0
}
अगर आप testToUpdate = { name: 'foo' }
. में पास होते हैं आप के साथ समाप्त होगा
Test.update({ ... }, { $set: { name: 'foo', nickname: undefined }}
क्योंकि आपको updatedValues.nickname
मिल रहा है तर्कों से दूर और परिभाषित नहीं है
आप क्या चाहते हैं है
Test.update({ ... }, { $set: updatedValues }
जिसका अनुवाद
. में किया गया हैTest.update({ ... }, { $set: { name: 'foo' } }
अब आप प्रचलित नाम के लिए एक कुंजी प्रदान नहीं कर रहे हैं, इस प्रकार इसे अपरिभाषित/शून्य पर सेट नहीं कर रहे हैं।
मैं एक नेवला प्लगइन का उपयोग करूंगा और आपके मॉडल के लिए सभी तरह से फ़ील्ड को मैन्युअल रूप से पास करने की चिंता नहीं करूंगा (देखें github.com/autolotto/mongoose-model-update )
- आप अद्यतन-सक्षम फ़ील्ड को परिभाषित कर सकते हैं और फिर आप बस
model.update(req.body)
कर सकते हैं और इस सब के बारे में चिंता न करें - यदि आप प्लगइन का उपयोग नहीं करना चाहते हैं तो भी आप बस
Test.findByIdAndUpdate(id, { name, nickname }, callback)
कर सकते हैं।