2014-10-17 3 views
4

내가 사용 배열 타입의 필드를 할당 '문자열의 배열'이 :몽구스 : 이메일을 저장하는 문자열의

var user = new Schema({ 
    // other fields... 

    emails: [String] 
}); 

이 필드를 업데이트하는 문제 되세요. 말, 이메일 1과 EMAIL2 값이다 내가보기에서 나타납니다 이상하게도,이 작품,

user.emails[0] = email1; 
user.emails[1] = email2; 
user.save(function(err, savedUser) { 
    console.log(savedUser.emails); // updated array [email1, email2] 
    // but if I retrieve now the user, the 'emails' field will not have above changes. 
}); 

:하지만

user.emails = [email1]; 
user.emails[1] = email2; 
user.save(); 
// user.emails == [email1, email2]; 
이 잘 작동
:

user.emails = [email1, email2]; 
user.save(); 
// fields are updated, all good 

을 그리고 이것은하지 않습니다

왜 이런 일이 일어 났는지 설명 할 수 있습니까?

답변

10

잘 설명되어 있지 않지만 배열 필드를 조작 할 때 배열이 수정되어 저장해야한다는 것을 알 수 있도록 Mongoose의 필드 변경 감지를 트리거해야합니다. 수동이 markModified 사용 신고 그래서 직접 대괄호 인덱스를 통해 배열 요소를 설정

는 수정 표시하지 않습니다

user.emails[0] = email1; 
user.markModified('emails'); 

을 또는 당신은 사용하여 한 번에 그것을 할 수 있습니다 몽구스 배열의 set 방법이 당신을 위해 일하는 이유

user.emails.set(0, email1); 

전체 배열 필드를 덮어 쓰기도 인을 트리거 :

user.emails = [email1, email2]; 

뿐만 아니라 :

user.emails = [email1]; 
user.emails[1] = email2; 

이 또한 작동하는 것을 의미합니다 :

user.emails = []; 
user.emails[0] = email1; 
user.emails[1] = email2; 
+0

많은 감사를! 현장 변경 감지를 사용하지 않고도 내 테스트에서 어떻게 작동 할 수 있는지 알고 있습니까? – eagor

+0

@eagor 예기치 않게 테스트에서 어떤 경우가 작동합니까? – JohnnyHK

+0

요소를 개별적으로 설정합니다 (user.emails [0] = email1 ...). 'dev'환경에서는 효과가 없었지만 'test'에서는 잘 작동했습니다 (새로 검색된 객체의 배열이 업데이트되었습니다). – eagor