2013-01-07 9 views
30

나는 몽구스 User 모델이 저장, 수정, 찾기 :몽구스 :

나는의 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!'); 
     } 
    }); 
}); 

?

+3

나는 User.findOne을 시도하는 대신 User.find의() 메소드를 제안() – sethetter

답변

39

Model.update을 사용하지 않으시겠습니까? 당신이 find를 사용하려면 내가 어떤 확인을 위해 클라이언트 측에서하고 싶은 것처럼,

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 인 배열입니다. 단일 인스턴스를 쿼리 할 때는 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

IT는 "중복 키"오류가 상승하지 않는 이유는 무엇입니까? – DeLac

+5

@DeLac 아니요, '저장'은이 경우 업데이트 작업을 수행합니다. – JohnnyHK

+0

@DeLac 사용자 '_id'를 (를) 저장하면 중복 키 오류가 발생할 수 있습니다. 이 경우 속성을 별도로 업데이트하거나'save '전에 먼저'_id'를 제거하십시오. – wag0325

3

: 모든 후 당신이 그것을 업데이트하는 것보다 아무것도에 대한 발견 사용자를 사용하지 않는 것이 특성이다.

finduser = user[0] 나를 위해 저장 방법의 작품을 만들어 추가 객체

findOne 만 반환 객체

의 배열을 돌려줍니다.

여기에 넣습니다.

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

이것은 @ JohnnHK 답변의 복제본이며, 또한 덜 정확합니다. – extempl