문제

나는 (pm --> persistanceManager를 사용하여) Google 데이터 저장소에 다음과 같은 쿼리를 시도하고 있습니다.

String filters = "(  field == 'value' ||  field == 'anotherValue' )";
Query query = pm.newQuery(myType.class, filters);

실행하면 다음과 같이 돌아옵니다. App Engine Datastore는 연산자를 지원하지 않습니다. 또는.

이러한 종류의 쿼리에 대한 사람들의 경험에서 가장 좋은 접근 방식은 무엇입니까?

도움을 주시면 감사하겠습니다!

도움이 되었습니까?

해결책

여러 쿼리를 수행하십시오. 다른 모든 데이터베이스와 마찬가지로 DataStore는 분리를 효율적으로 실행할 수 없습니다. 다른 데이터베이스와 달리,이 난이도를 사용자에게 노출시켜하고있는 일이 효율적이지 않다는 것을 분명히합니다. 유일한 솔루션은 여러 쿼리를 실행하는 것입니다.

다른 팁

GAE의 JDO 및 JPA 구현이이를 지원하는지는 모르겠지만 저수준 API를 사용하면 하나의 쿼리에서 연산자를 사용할 수 있습니다.

Query query = new Query("Issue");
List<String> list = Arrays.asList("NEW", "OPEN", "ACCEPTED");
query.addFilter("status", FilterOperator.IN, list);

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
PreparedQuery preparedQuery = datastore.prepare(query);
for (Entity entity : preparedQuery.asIterable()) {
    // should iterate over 'NEW', 'OPEN' and 'ACCEPTED' issues
}

에 따르면 Google App Engine - 쿼리 및 색인:

쿼리 필터

필터 필드 이름, 연산자 및 값을 지정합니다.값은 앱에서 제공해야합니다.다른 속성을 참조하거나 다른 속성으로 계산할 수 없습니다.연산자는 다음 중 하나 일 수 있습니다. < <= == >= >

메모: Java DataStore 인터페이스는 Python Datastore 인터페이스에서 구현 된! = 및 필터 연산자를 지원하지 않습니다.(Python 인터페이스 에서이 연산자는 클라이언트 측 라이브러리에서 여러 데이터 스토어 쿼리로 구현됩니다.그들은 데이터 스토어 자체의 특징이 아닙니다.)

필터의 주제는 기본 키 및 Entity Group 부모를 포함하여 모든 객체 필드가 ​​될 수 있습니다 ( 업무).

엔티티는 모든 필터를 일치 시키려면 결과가되어야합니다.JDOQL 문자열 구문에서 여러 필터가 지정됩니다. && (논리적 "그리고").필터의 다른 논리적 조합 (논리적 "또는", "not")은 지원되지 않습니다.

App Engine Datastore가 쿼리를 실행하는 방식으로 인해 단일 쿼리는 불평등 필터를 사용할 수 없습니다.< <= >= >) 둘 이상의 속성에.동일한 속성의 여러 불평등 필터 (예 : 다양한 값에 대한 쿼리)가 허용됩니다.보다 쿼리에 대한 제한 사항.

기본적으로 하나의 조건 또는 여러 개의 "and" 조건을 사용하여 원하는 것을 찾을 수 있도록 데이터를 재구성해야 하거나 두 개 이상의 쿼리를 통해 데이터를 검색해야 합니다. 코드에서 이를 필터링/결합합니다.

게임에 늦어서 미안 해요 .. 오늘 방금 질문을 했어요.

"Simulate"in in '및'또는 '동작을하는 또 다른 방법은 "낮은 레벨"데이터 스토어 API를 사용하는 것입니다. DatastorEservice는 키 모음을 받아들이는 get () 메소드를 지원하고 전달 된 키에 일치하는 모든 엔티티의 맵을 반환합니다. 인터페이스이지만 즉시 사용 가능한 인스턴스를 분배 할 수있는 편리한 DatastorEserviceFactory가 있습니다.

불행히도 Google 은이 저수준 API 접근 방식을 홍보하고 싶지 않다고 결정했으며 개발자가 JDO 또는 JPA를 사용하는 것을 선호하므로 Javadocs와 Google "DatastorEservice"를 할 때 찾을 수있는 모든 코드 샘플 이외의 문서가 없습니다. .

TL

늦게 깨는 소식 .. 적어도 난 그냥 받고 있어요. GAE의 최신 Java SDK를 다운로드 할 때 "Issue 29 : Expose Batch Gets"가 최신 릴리스 (v1.2.1)에 수정되었다는 릴리스 노트에서 알았습니다. 기본적으로 우리는 (동일한 지원을 찾고있는 것 같습니다) "저수준"데이터 스토어 API로 떨어지지 않고 JDO 기반 대안을 가질 수 있습니다. 방금 최신 Java Gae SDK를 다운로드 했으므로 아직 테스트 할 기회가 없었지만 최대한 빨리 헤드 업을하고 싶었습니다. 이 "수정"을 확인한 후에 배운 내용을 더 게시하겠습니다.

내 의견을 답으로 다시 게시하여 stackoverflow 에티켓을 깨뜨린 경우 사과를 받아들이지만 두 가지 이유로 결정하기로 결정했습니다. 첫째, 동일한 문제를 다시 다루고 있지만이 새로운 정보는 문제에 대해 완전히 다른 "답변"을 제공하는 것으로 보입니다. 두 번째로, 나는 내가 제공 한 첫 번째 대답을 조사하기 전에 주석 양식이 당신의 관심을 끌지 않을 것이라고 우려했습니다.

다음에 연기하기 전에 더 신중하게 생각하겠습니다.

TL

"직접 수행"해야하는 한 가지 방법은 매개 변수화 된 쿼리를 사용하는 것일 수 있습니다.

   Query query = pm.newQuery(mytype.class);
   query.setFilter("field == autoParam");
   query.declareParameters("String autoParam");

   List<String> params = myListOfThingsFieldCanBeEqualTo;

   Set merged = new HashSet();
   for (String f : params) {
     merged.addAll(q.execute(f));
   }

클레투스의 대답과는 달리, OR-ing 작동, 어쨌든 최신 버전의 App Engine에서는 가능합니다.

실제로 제가 가지고 있는 App Engine 1.3.0에서는 OR-ing이 작동하지 않는 것을 발견했습니다. Google App Engine - 쿼리 및 색인 (그의 답변에서 언급된 동일한 소스 cletus)

결과가 되려면 엔터티가 모든 필터와 일치해야 합니다.JDOQL 문자열 구문에서 ||로 여러 필터를 분리 할 수 ​​있습니다. (논리적 "또는") 및 && (논리적 "및"), 그러나 || 필터를 분리 할 때만 사용할 수 있습니다. 모든 필드 이름을 갖습니다.다시 말해, || 분리 된 필터를 단일 orpants () 필터로 결합 할 수있는 상황에서만 합법적입니다.

나는 그의 답변 이후(그리고 마지막으로 App Engine을 업데이트한 이후) 이 문제에 대해 App Engine이 업그레이드된 것이 틀림없다고 생각했습니다.

App Engine을 1.3.4로 업데이트하면 OR-ing이 작동합니다! 제한이 있지만.

어쨌든 cletus에게 감사드립니다 :)

포함 메소드를 사용할 수 있습니다

String filters = "( :values.contains(field) )";
Query query = pm.newQuery(myType.class, filters);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top