2014-10-19 12 views
8

नहीं हटाता है मैं निम्नलिखित नेवला मॉडल है:नेवला findByIdAndUpdate अद्यतन गुण

var mongoose = require('mongoose'); 

var userSchema = mongoose.Schema({ 
    facebook: { 
     name: String, 
     email: String, 
     customerId: String 
    } 
}); 

var User = mongoose.model('User', userSchema); 

जब मैं का उपयोग कर findByIdAndUpdate

User.findByIdAndUpdate(id, { 
    $set: { 
     facebook: { 
      name: name 
     } 
    } 
}); 

name अद्यतन हो जाता है इस दस्तावेज़ का एक हिस्सा अद्यतन करते हैं, जबकि email और customerId भी निकल जाते हैं (सेट नहीं?)।

मुझे यह दस्तावेज नहीं मिला।

क्या findByIdAndUpdate के साथ केवल विशिष्ट दस्तावेज़ गुणों को अपडेट करने का कोई तरीका है?

उत्तर

13

FindByIdAndUpdate वास्तव में एक mongodb ढूंढता है और दस्तावेज़ आईडी द्वारा अद्यतन आदेश को संशोधित करता है।

बिंदु यह है कि आप पुराने ऑब्जेक्ट को ओवरराइट करने के लिए ऑब्जेक्ट सेट कर रहे हैं। यदि आप किसी फ़ील्ड को अपडेट करना चाहते हैं तो आपको अपनी अपडेट ऑब्जेक्ट को संशोधित करने की आवश्यकता है।

User.findByIdAndUpdate(id, { 
$set: { 
    'facebook.name':name  
} 
}); 

यह केवल नाम फ़ील्ड को अपडेट करेगा, शेष ऑब्जेक्ट को पिछले एक पर रखेगा।

+0

हाँ, धन्यवाद। मैंने इसे खुद को मोंगोड डॉक्स में पाया। क्या मुझे $ सेट का उपयोग करना है? – krl

+0

बेशक हाँ यदि आप $ सेट का उपयोग नहीं करते हैं तो यह दस्तावेज़ को सभी पुराने फ़ील्ड को निकालने के लिए केवल ऑब्जेक्ट अपडेट करने के लिए अपडेट करेगा। –

+1

अच्छा, यह नहीं है। मैंने बस इस तरह सेट किए बिना इसका परीक्षण किया: User.findByIdAndUpdate (id, {'facebook.name': name}) और यह सभी पुराने फ़ील्ड रखे। – krl