2010-11-30 3 views
0

당신은 값이 데이터 저장소에 문자열 목록이있는 경우 :App Engine은, 확인하는 방법

C

A, B를, 문자열 목록의 모든 값이 목록에있는 경우에만 true를 반환하도록 목록과 비교할 수 있습니까?

[ 'A', 'B', 진정한

[ 'A'를 반환 [, 'C'를 'B'를 'A'] 'B'를 거짓

을 반환 ' c, d, e ']는 true를 반환합니다.

GQL만으로 가능합니까? 아니면 문자열 목록을 잘라내어 반복해야합니까? the documentation에서

+0

특정 엔티티의 목록을 비교하거나 실제로 목록을 포함하는 엔티티를 쿼리하고 싶습니까? 쿼리는 "true"또는 "false"를 반환하지 않으므로 명시 적으로 GQL에서 원하는 것을 수행 할 수 없습니다. – geoffspear

+0

@Wooble 목록을 포함하는 엔티티에 대한 쿼리는 제가 의미 한 것입니다. 나는 질의가 true 또는 false를 반환하지 않을 것이라는 것을 깨닫는다. 그것은 내 부분에서 가난한 표현이다. – jond

답변

2

:

쿼리는 두 개의 목록 값을 비교할 수 없습니다. 각 요소를 개별적으로 테스트하지 않고도 두 목록이 동일한 지 테스트 할 수있는 방법은 없습니다.

그래서 저는 귀하의 비교도 직접 불가능하다고 생각합니다.

목록을 반복하지 않고 비교할 집합을 사용하는 것이 더 효율적일 수 있습니다.

1

정렬 된 방식으로 목록을 단일 StringProperty로 직렬화 할 수 있습니다. StringListProperty의 내용에 따라 쉼표로 구분 된 값처럼 사소 할 수 있습니다.

선택적으로 md5 체크섬과 같은 것을 사용하여 저장 및 필터링되는 문자열 길이를 줄일 수 있습니다.

2

이것은 직접 가능하지 않습니다. 여러 평등 필터를 사용할 수 있으며 쿼리는 적어도 목록의 해당 항목이있는 항목 만 일치시킵니다 (예 : "WHERE foo = 'a'AND foo = 'b'"는 foo가 최소한 'a'와 'b'). 비항 등 필터 나 정렬 순서없이이 작업을 수행하면 데이터 저장소는 쿼리를 충족시키기 위해 기본 제공 병합 조인 전략을 사용합니다.

그러나 비정규 화는 더 강력한 솔루션을 제공합니다. 예를 들어 목록을 단일 문자열로 직렬화하는 경우 해당 문자열과 일치하는지 간단히 확인할 수 있습니다.

+0

여러 평등 필터를 사용하면 성능이 저하됩니까? 문자열을 목록으로 serialize하는 경우 문자열에 추가 문자가있을 때 동등성을 검사하는 방법은 무엇입니까? 예 : 'a, b, c'는 'a, b, c, d'와 비교됩니다. – jond

+0

jond : 병합 조인 전략을 사용하는 쿼리는 실제로 단일 인덱스에서 조회가 필요한 쿼리보다 느리지 만 유일한 해결책 일 수 있습니다 슈퍼 케이스를 검색 할 수 있기 때문에 기본적으로 문자열로 직렬화 된 가능한 하위 집합 목록을 사용해야합니다. 목록의 크기가 커지면 점점 추해집니다. – geoffspear

+0

@jond 나는 당신이 똑같은리스트를 가지고 슈퍼 세트가 아닌 엔티티들을 검색하기를 원한다고 생각 했습니까? –

관련 문제