質問

の私は意志href="https://stackoverflow.com/questions/327727/gql-query-to-effectively-span-entity-relationships">にこの異なるが、無関係ではない質問を

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

class Bar(db.Model): pass

私は、特定のFooエンティティを持っているし、私もそのバーで特定のバーのキーを含む他のfooエンティティのすべてを取得したい場合はListProperty、私は次のクエリを使用します:

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

私はバーのエンティティを一致させる少なくともN番号を持っているモデルの種類fooの他のすべてのエンティティを検索したい場合は? forループでこれを行うには明白な方法は、大幅な非効率性を伴うだろう、それは実際にこれを容易にするためにモデル自体を変更することが最善であるかもしれないが、そうする方法を明らかにいないようです。

役に立ちましたか?

解決

10 bar_entitiesを持つFOOレコードを考えると45可能平等につながるこれらの10件の事業体の少なくとも2を持っているすべてのfooレコードを探して値10!/(2!*(10-2)!)45 =。

これは(2-1)= 10読み出す。

10_C_に推定することができます
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.

1回の読み取りにこれを削減するには、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

この方法は、あなたは文句を言わない任意の爆発指数の問題に入るます。

あなたはまた、これらのそれぞれについて、あなたは読み込みの10_C_(n-1)の数をfoo_combo_n_tableを作成または実行する必要がありますよりも、任意の3つのまたは4つのエンティティをやってみたかった場合ます。

他のヒント

あなたは、単に繰り返し同じフィルタを適用することができます:

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)
あなたが任意の不平等を適用するか、クエリにソート順をしていない場合は、

、データストアには関係なく、あなたが適用されますどのように多くのフィルタの、インデックスに建てられ、マージ戦略への参加を使用してクエリを実行することができるようになります。あなたが不平等を必要とするか、順番を並べ替える場合は、しかし、あなたは爆発インデックスにつながる、フィルタ処理することがあります棒の各番号のインデックス持っている必要があります(とそうで最高の回避を!)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top