문제

참조 이 다르지만 관련이없는 질문 예제 모델을 빌릴 것입니다.

class Foo(db.Model): bars = db.ListProperty(db.Key)

class Bar(db.Model): pass

특정 FOO 엔티티가 있고 Bars ListProperty에 특정 막대 키가 포함 된 다른 모든 Foo 엔티티를 얻고 싶다면 다음 쿼리를 사용합니다.

related_foos = Foo.all().filter('bars', bar_entity).fetch(fetch_count) 

적어도 N 수의 일치 바 엔티티를 가진 다른 모든 모델 Kind Foo를 찾고 싶다면 어떨까요? For-Loop 으로이 작업을 수행하는 명백한 방법에는 과감한 비 효율성이 포함되며 실제로 모델 자체를 쉽게 변경하여 쉽게 변경하는 것이 가장 좋지만 어떻게 해야하는지는 분명하지 않습니다.

도움이 되었습니까?

해결책

10 Bar_entities가 있고이 10 개 엔티티 중 2 개 이상의 모든 FOO 레코드를 찾고있는 FOO 레코드가 주어지면 45 개의 가능한 평등 값 10!/(2!*(10-2)!) = 45를 초래할 수 있습니다.

이것은 10_c_ (2-1) = 10 읽기에서 추론 할 수 있습니다.

SELECT * from table WHERE bar="1" AND bar in ["2", "3", "4", "5", "6", "7", "8", "9", "0"]
SELECT * from table WHERE bar="2" AND bar in ["3", "4", "5", "6", "7", "8", "9", "0"]
SELECT * from table WHERE bar="3" AND bar in ["4", "5", "6", "7", "8", "9", "0"]
etc.

이것을 하나의 읽기로 줄이려면 FOO 레코드가 추가되면 주어진 레코드의 2 가지 조합이 모두있는 별도의 테이블을 채워야합니다.

Say you had

foo_table
foo1 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
foo2 [1, 3, 4]
foo3 [1, 2, a]
foo4 [b, 6, c]

foo_combo_2_table
Parent  Combination
foo1    12
foo1    13
... and all 45 foo1 combinations each in its own row
foo2    13
foo2    14
foo2    34
foo3    12
foo3    1a
foo3    2a
etc.

Now you can do a 

indexes = SELECT __KEY__ from foo_combo_2_table WHERE combination IN [12, 13, 14, 15, ... all 45]
keys = [k.parent() for k in indexes] # you would need to filter for duplicates

이렇게하면 폭발적인 인덱스 문제가 발생하지 않을 것입니다.

각각보다 3 개 또는 4 개의 엔티티를 수행하려면 FOO_COMBO_N_TABLE을 만들거나 10_C_ (N-1) 수의 읽기를 수행해야합니다.

다른 팁

동일한 필터를 반복적으로 적용 할 수 있습니다.

related_foos = Foo.all().filter('bars', bar_entity).filter('bars', bar_entity_2).fetch(fetch_count)

또는 데이터 중심 :

q = Foo.all()
for bar in bar_entities:
  q.filter('bars', bar)
related_foos = q.fetch(fetch_count)

불평등이나 정렬 주문을 쿼리에 적용하지 않으면 DataStore는 적용 필터 수에 관계없이 내장 인덱스 및 병합 조인 전략을 사용하여 쿼리를 실행할 수 있습니다. 그러나 불평등 또는 정렬 순서가 필요한 경우 필터링하려는 각 막대에 대한 색인이 있어야하므로 인덱스가 폭발적으로 발생합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top