2013-01-07 88 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直接發送命令到MongoDB - 文件不返回 - 所以沒有什麼可以運行驗證」 - Aaron Heckmann https://github.com/LearnBoost/mongoose/issues/ 635 – jackdbernier

+5

請注意,Model.update未通過架構中定義的驗證!見第一段:http://mongoosejs.com/docs/validation.html –

80

回調參數user是一個find的數組。查詢單個實例時,使用findOne而不是find

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 OP的問題不是驗證,而是訪問。一旦你有權訪問這個對象,你可以自由地編寫任何邏輯,無論它是驗證還是修改。 –

+0

這是@JohnnyHK答案的重複,而且更不正確。 – extempl