2012-06-25 18 views
1

시나리오 1 : 위대한 할아버지 조상이 있다면 (그에게 A라고 부름); 그리고 내 열쇠는 "child1"에서 왔습니다. 내 할아버지가 A인지 확인하는 방법이 있니? (반복 할 필요없이 할 수 있기를 바랍니다)위대한 할아버지 AppEngine 상위 쿼리

child1의 키가 "A-> B-> C"경로인지 확인 할 수 있습니다.
A -> B -> C -> (자식 1, 자식 2 ...)

시나리오 2 : 상기에서 . 위대한 할아버지는 "G"의 또 다른 후손이 있고, "H"의 어린이를 검색하고 싶습니다 :

A-> B -> C -> (아동 C의)
...-> G를 - > H -> (H의 아이들)
할아버지가 A, G에서 H 로의 경로를 알고 있다고 생각하면서 "H"의 아이들을 검색하고 싶습니다.

는 그 아이를 확인하려면 1의 : 좋지 않을까

답변

2

는 시나리오 1은 ... : 당신이 Go1 예제가있는 경우

을 (루프하지 않고, 내가 쿼리에서이 작업을 수행 할 수 있기를 바랍니다) great-grandpa가 A이면 key.getParent()를 두 번 호출해야합니다 (null 부모를 확인). 이것을 확인할 수있는 API가 없습니다.

엔티티 X가 A를 상위 항목으로 갖고 있는지 확인하려면 key.getParent()를 N 번 호출해야합니다.

그러나 오버 헤드가 최소화됩니다. key.getParent()를 호출해도 실제 데이터 저장소에 대한 호출이 발생하지 않습니다.

물론 C/엔티티 X가 A의 자손임을 보장 할 수 있습니다 (시나리오 2에서와 같이). 따라서 쿼리 결과를 확인하지 않아도됩니다. 쿼리 실행에 대한 데이터 저장소가이를 확인합니다. 위한

https://developers.google.com/appengine/docs/java/datastore/queries 는 => 검색 쿼리 조상 https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/Query#setAncestor(com.google.appengine.api.datastore.Key)

childCQuery.setAncestor (entityA.getKey());

시나리오 2 :

할아버지 'A'는 아이들이 추가 시간에 언제든지 제거 할 수 있기 때문에 'H'의 경로를 알 수 없습니다. 엔티티가 'A'의 하위 항목 일 수있는 것에 대한 제한은 없습니다. 따라서 데이터 저장소 쿼리 만 사용하면 'A'의 하위 항목을 결정할 수 있습니다.

시나리오 1에서 설명한 것처럼 쿼리에서 조상으로 'A'를 지정하여 'A'가 조상이 아닌 결과를 필터링 할 수 있습니다.

희망 사항이 질문에 대한 답변입니다.

참고 : 내 질문에 대한 답변은 Java API를 참조하십시오. 아직 Go API에 익숙하지 않습니다.

감사합니다.

amir

+0

설명 : ** 키 **에서 getParent를 호출하는 데 오버 헤드가 없습니다. ** 엔티티 **에서 getParent를 호출하면 실제로 데이터 저장소에서 부모 객체가 얻어 지므로 오버 헤드가 발생합니다. –

+0

오른쪽. 그것이 내가 말할 수있는 것입니다. key.getParent()에는 오버 헤드가 없습니다. 나는 내 대답을 편집했다. 감사! – Amir

+0

Great grandpa 질문에 감사드립니다. 더 깊은 계층 구조를 구현할 때 경로로 레이블이 지정된 유형의 노드를 추가했는데이 노드는 문자열 경로를 포함하고 다른 모든 일반 노드의 컨테이너입니다. –