2011-02-09 3 views
0

아주 작고 단순한 유스 케이스에 MongoDB를 사용하는 방법을 알아 내려고했지만 다소 혼란 스럽습니다. 내 문서는 사용자가 많은 이메일을 가질 수 있다는 사실을 나타내야합니다. the documentation을 따르는 경우 가장 확실하고 간단한 해결책은 삽입을 사용하는 것입니다. 문제는 내가 독창성을 위해 전자 메일 주소의 유효성을 검사하려고 할 때 AFAIK가 포함 된 상태로 불가능하다는 것입니다 (물론 map/reduce를 사용할 수 있지만 매우 좋지 않은 선택 인 것 같습니다).참고 자료 대 MongoDB의 임베드

나는 확실히 자신의 컬렉션에 대한 자격이 없다고 느낀다.하지만 분명히 임베디드 오브젝트는 유효성 검사를하도록 내버려 두지 않는다. (그렇다면 실제로는 효율적이라고 생각하지 않는다). 이 상황에서 스키마를 어떻게 설계 하시겠습니까?

답변

2

{unique : true}를 설정하여 이메일 하위 필드에 색인을 정의 할 수 있습니다. 이렇게하면 전자 메일 주소의 여러 복사본이 컬렉션에 저장되지 않습니다.

db.users.ensureIndex(['emails.address',1], {unique: true}) 

지금 당신은 얻을 것이다 :

db.users.findOne() => 
{ 
    "name" : "xxxx", 
    "emails" : [ 
    { address: "[email protected]", validated: false }, 
    { address: "[email protected]", validated: true } 
    ] 
} 

당신은이 같은 email.address 필드에 고유 인덱스를 정의 할 수 있습니다 : 예를 들어

,의이 문서는 다음과 같이 보일 가정 해 봅시다 같은 이메일 주소를 두 번 삽입하려고하면 오류가 발생합니다. 또한 이메일 주소로 사용자를 찾는 것을 최적화 할 수 있습니다. 이메일 주소는 앱에서 유용 할 수 있습니다.

+0

전체 "이메일"컬렉션에서 여러 복사본을 방지합니까, 아니면 사용자와 관련이 없습니까? 삽입물이 작동하는 방식을 이해했다면 사용자는 일종의 범위로 작동해야합니다. – ngw

+1

전체 사용자 컬렉션에서 고유성이 적용됩니다. 예를 들어 "[email protected]"이라는 첫 번째 사용자를 추가하면 고유 색인이 "[email protected]"이 다른 사용자에게도 사용되지 못하게합니다. – jared

관련 문제