2012-05-02 2 views
5

Spring 데이터를 사용하면 @Document 주석을 사용하여 개체를 저장할 컬렉션을 지정할 수 있습니다. 학생과 교사라는 두 가지 수업이 있으며 모두 인물 컬렉션에 보관되어 있다고 가정 해보십시오. 다음 코드를 실행하면동일한 컬렉션에 저장된 여러 클래스를 쿼리하는 스프링 데이터 mongodb

mongo.find(new Query(), Teacher.class); 

결과에 학생과 교사가 모두 포함됩니다. Spring-Data에 의해 생성 된 데이터를 보면 각 문서는 그것이 유지되는 클래스를 나타내는 "_class"필드를 포함합니다.

이 필드는 찾기에서만 필터를 사용하여 교사를 반환하지 않습니다. 이 작업을 수행하는 것 외에도 교사 만 질문하는 방법은 무엇입니까?

mongo.find(new Query().addCriteria(where("_class").is(Teacher.class.getCanonicalName()), Teacher.class); 

답변

1

이것은 컬렉션을 디자인하는 방법에 대한 질문입니다. Mongo는 형식에 대해 전혀 모르기 때문에 문서를 서로 구별 할 수 있도록 추가 메타 데이터를 추가해야합니다. 따라서 쿼리 할 때 이러한 제약 조건을 쿼리에도 추가해야합니다. 을 통해 _class 키를 참조 할 수 있습니다.

mongo.find(new Query(Teacher.class), Teacher.class); 

그것은 여전히 ​​두 번 국가 도메인 클래스에 가지고 조금 이상한 느낌 (:

우리는 하나는이 같은 특정 유형의 문서를하고 싶어 표현하는 쿼리에 몇 가지 API를 추가하는 방법에 대한 생각 결과를 특정 유형의 문서로 제한하고 다른 클래스에 매핑하려는 경우이 방법이 유용합니다. 그 이상의 경우 유형을 정확히 나타내는 유형을 문자열로 저장하고 클래스가 이미로드 된 경우 상속 만 적용 할 수있는 결과로만 결과를 제한 할 수 있습니다. 따라서 Person 유형의 문서를 쿼리 할 때는 모든 문서를 먼저로드하고 형식을 조회 한 다음 형식 검사를 수행하고 성능상의 이유로 최적이 아닌 결과를 버리십시오.

또 다른 옵션은 클래스가 할당 할 수있는 모든 유형 (아마도 Object을 제외한 모든 인터페이스와 수퍼 클래스)을 저장하는 것이지만 꽤 많은 양의 데이터가 저장 될 수 있습니다. 이것은 @Document 주석에 플래그를 추가하여 차례로 접근 할 수 있습니다.

결론 : 현재 다른 방법은 없지만 JIRA 티켓을 향상시킬 수있는 방법이 있다면 JIRA 티켓을 무료로 제공해주십시오.

+0

감사 올리버, 나는 티켓을 올릴 것이다. – ltfishie

+0

mongodb Jira를 지나는 중에, 1.0.M3으로 고정 된 시장 인이 티켓 https://jira.springsource.org/browse/DATAMONGO-128을 발견했습니다. 여전히 소스에 있습니까? – ltfishie

+0

예.하지만이 시나리오에 영향을 미치지 않습니다. 이 티켓은'Person'과'Teacher'를 같은 콜렉션 안에 저장하고 그것으로부터 객체를 쿼리 할 수 ​​있고'Person'과'Teacher'를 인스턴스화 할 수 있다는 것을 다룹니다 (그러므로 필요한 타입 정보). 실제로 "오직 읽기 전용"교사용 "시나리오를 개선하는 것을 고려하지 않습니다. –

1

는이 질문에 대한 가장 좋은 해결책이다 : 나는 좋은 해결책을 마련하는 경우

query.restrict(Teacher.class,Teacher.class); 
+3

제안 된 답변에 대한 자세한 내용은 OP – Hawk

+0

Perfect에 큰 도움이 될 것입니다. –

관련 문제