2013-01-07 6 views
30

मैं एक नेवला User मॉडल है:नेवला:, का पता लगाएं, संशोधित करने, बचाने

var User = mongoose.model('Users', 
    mongoose.Schema({ 
     username: 'string', 
     password: 'string', 
     rights: 'string' 
    }) 
); 

मैं User मॉडल का एक उदाहरण मिल जाए, यह गुण है, संशोधित करने, और परिवर्तनों को सहेजना चाहते। यह मैं क्या कोशिश की है है (यह गलत है!):

User.find({username: oldUsername}, function (err, user) { 
    user.username = newUser.username; 
    user.password = newUser.password; 
    user.rights = newUser.rights; 

    user.save(function (err) { 
     if(err) { 
      console.error('ERROR!'); 
     } 
    }); 
}); 

क्या वाक्य रचना, लगता है संशोधित करने और बचाने के User मॉडल का एक उदाहरण के लिए है?

+3

मैं User.findOne की कोशिश कर रहा सुझाव है() User.find के बजाय विधि() – sethetter

उत्तर

39

Model.update का उपयोग क्यों नहीं करें? सब के बाद आप इसे अद्यतन करने के लिए की तुलना में कुछ और के लिए मिला उपयोगकर्ता उपयोग नहीं कर रहे गुण है:

User.update({username: oldUsername}, { 
    username: newUser.username, 
    password: newUser.password, 
    rights: newUser.rights 
}, function(err, numberAffected, rawResponse) { 
    //handle it 
}) 
+8

हां, लेकिन इस से सम्मानित किया जाए "Model.update सीधे मोंगोडीबी को आदेश भेज रहा है - दस्तावेजों को वापस नहीं किया जाता है - इसलिए सत्यापन पर चलाने के लिए कुछ भी नहीं है" - हारून हेकमेन https://github.com/LearnBoost/mongoose/issues/ 635 – jackdbernier

+5

कृपया ध्यान दें कि Model.update स्कीमा में परिभाषित सत्यापन को पास नहीं करता है! पहले पैराग्राफ को देखें: http://mongoosejs.com/docs/validation.html –

80

user आपके कॉलबैक का पैरामीटर find के साथ एक सरणी है। एक उदाहरण के लिए पूछताछ करते समय find के बजाय findOne का उपयोग करें।

User.findOne({username: oldUsername}, function (err, user) { 
    user.username = newUser.username; 
    user.password = newUser.password; 
    user.rights = newUser.rights; 

    user.save(function (err) { 
     if(err) { 
      console.error('ERROR!'); 
     } 
    }); 
}); 
+2

यह एक "दोहराव कुंजी" त्रुटि वृद्धि नहीं करता है? – DeLac

+5

@DeLac नहीं, 'save' इस मामले में एक अद्यतन ऑपरेशन करता है। – JohnnyHK

+0

@DeLac, आप उपयोगकर्ता '_id' को सहेजने से डुप्लिकेशन कुंजी त्रुटि देख सकते हैं। इस स्थिति में, गुणों को अलग से अपडेट करने का प्रयास करें या 'save' से पहले' _id' को हटा दें। – wag0325

3

आप find उपयोग करना चाहते हैं, जैसे मैं किसी भी सत्यापन के लिए आप ग्राहक के पक्ष में करना चाहते हैं।

find वस्तुओं

findOne रिटर्न केवल एक वस्तु

user = user[0] मेरे लिए बचाने के विधि काम बना जोड़ा जा रहा है की एक सरणी देता है।

यहां वह जगह है जहां आप इसे डालते हैं।

User.find({username: oldUsername}, function (err, user) { 
    user = user[0]; 
    user.username = newUser.username; 
    user.password = newUser.password; 
    user.rights = newUser.rights; 

    user.save(function (err) { 
     if(err) { 
      console.error('ERROR!'); 
     } 
    }); 
}); 
+12

सर्वर पर सत्यापन न करने का सुझाव भयानक सलाह है। – VtoCorleone

+0

@VtoCorleone ओपी की समस्या सत्यापन नहीं है, यह पहुंच है। एक बार जब आप ऑब्जेक्ट तक पहुंच प्राप्त कर लेते हैं, तो आप इसके चारों ओर किसी भी तर्क को लिखने के लिए स्वतंत्र हैं या संशोधन हो सकते हैं। –

+0

यह @JohnnyHK उत्तर का डुप्लिकेट है, और इसके अलावा, कम सही है। – extempl