2012-03-27 2 views
1

문서 구조쿼리 (모르핀에, MongoDB를) (단지 그림)

직원

{ 
name : "..", 
age : .., 
addresses [ 
    { 
    "street":"...", 
    "country":{ 
     name:"..", 
     continent:"..", 
     Galaxy:".." 
    } 
    } 
], 
company:".." 
} 

쿼리 - 난 그냥 주소 한

-> 거리 (유형 문자열) 및 주소 -> 국가 -> 이름 (유형 문자열). 그리고 나는이 기준에 맞는 모든 직원을 얻고 싶습니다.

Address a1 = new Address(); 
a1.setStreet("bla bla"); 
Country c = new Country(); 
c.setName("sth"); 
a1.setCountry(c); 

Query<Employee> q = ds.createQuery(Employee.class).field("addresses").hasThisElement(a1) 

결과를 가져 오지 않습니다 (실제로 일치하는 경우). 부분적인 "국가"문서 일치 때문입니다. 을 모두 입력하면 개의 국가 필드가 예상대로 결과를 얻습니다.

질문 # 1 : 위의 해결 방법은 무엇입니까?

질문 # 2 : 주소는 배열이고 여러 주소 (주소 # 거리, 국가 # 이름) 쌍을 가져올 수 있으며 주어진 쌍과 일치하는 직원 목록을 다시 원합니다. 뭔가 같은 :

Query<Employee> q = ds.createQuery(Employee.class).field("addresses").hasThisElement(a1).field("addresses").hasThisElement(a2).field(..) // and so on 

참고 :이

Address a = new Address(); 
a.setStreet("bla bla"); 
q.createQuery(Employee.class).field("addresses").hasThisElement(a).field("addresses.country.name").equal("hoo"); 

같은 고장 주소 일치 뭔가하지만이 곳 거리 = "어쩌구 저쩌구"와 country.name 직원을 일치 할 수 = "~이"에! 주소 # 1과 거리! = "bla bla"및 주소. # 2의 country.name = "hoo". 당신은 요점을 얻습니다. 나는 그러한 직원들을 돌려주기를 원하지 않는다.

가능한지 알려주세요. 감사합니다.

+0

이 문제에 대한 해결책을 찾은 적이 있습니까? –

답변

1

가능합니다. MongoDB는 elemMatch라는 상황을위한 특수 연산자를 가지고 있습니다. Morphia는이를 지원합니다.

두 번째 방법이 올바른 방법입니다 (첫 번째 방법은 하위 키가 아닌 전체 국가를 일치 시키려고합니다). 유일한 것은 street과 country.name이 일치하는 단일 요소로 제약하고 싶다는 것입니다. 일치하는 거리와 일치하는 country.name이있는 문서가 아닙니다.

이 문서 페이지와이 스레드에는 몇 가지 추가 정보가 있습니다.

http://groups.google.com/group/morphia/tree/browse_frm/month/2011-02/5bd3f654526fa30b?rnum=41&lnk=ol

http://code.google.com/p/morphia/wiki/Query

는 불행하게도 나는 당신에게 그것을 해결하기에 충분한 정보를 줄 것이다 잘하면 잘 모르핀을 알고 있지만하지 않습니다.