2012-04-18 16 views
6

のは、私は同じタイプのすべてのa、b、cの実体があるとしましょう、と状況はこのようなものです:直接子孫のみを照会する方法はありますか?

エンティティAエンティティB エンティティBの親は

今もしエンティティcの親があるさ私は次のクエリを実行します

query = ndb.Query(ancestor=a.key) 
result = query.fetch() 

結果にbとcの両方のエンティティが含まれます。直接子孫であるエンティティだけが残るように、フィルタリングする方法はありますか?私とは別に、結果を通ってそれらを取り除くという意味です。

答えて

4

これを行う唯一の方法は、スキーマを変更して、エンティティの直接の親を参照する '親'のKeyPropertyを追加し、それをフィルタリングすることです。

+4

はまた、祖先クエリの結果は、実際にも、(彼らはすべて同じ種類を持っていると仮定)が含まれていることに注意してください。ルートがレベル0、直接的な子がレベル1、子レベル2が、そしてoがそれぞれのエンティティに「レベル」のプロパティを持つこともできます。 –

1

実際、これはまったくサポートされていません。ニックの答えは動作しますが、OPで指定されていないクエリでエンティティの種類を指定できる場合にのみ、

"無関係なクエリはプロパティのフィルタを含めることはできませんが、Entity.KEY_RESERVED_PROPERTYフィルタのプロパティ名として使用できます。Entity.KEY_RESERVED_PROPERTYの昇順ソートもサポートされています。

+0

私はニックの答えを使用しており、それは正常に動作します。私はポリモデルに移動しなければならなかった。 – sorin7486

+0

@ sorin7486だから、フィルタを含む祖先クエリを成功させたが、その種類は含まれていないと言っていますか? – moin

+0

それは種類を含んでいます、それは基本的な種類です。私のすべてのオブジェクトは異なる種類のページであり、それらはすべてPageクラスを拡張します。 – sorin7486

0

これは少し遅れていますが、同じ問題を抱えている人には役立ちます。

解決策は、最初にキーのみのクエリを実行し、直接の子孫であるキーのサブセットを取得することです。

キーのサブセットを使用すると、目的のエンティティをバッチで取得できます。

私はここに行くの例ですが、pythonのに慣れていないよ:

directDescKeys := make([]*datastore.Key, 0) 

q := datastore.NewQuery("A").Ancestor(parentKey).KeysOnly() 
for it := q.Run(ctx);; { 
    key, err := it.Next(nil) 
    if err == datastore.Done { 
     break 
    } else if err != nil { 
     // handle error 
    } 

    if reflect.DeepEquals(key.Parent(), parentKey) { 
     directDescKeys = append(directDescKeys, key) 
    } 
} 

entities := make([]*A, len(directDescKeys)) 
if err := datastore.GetMulti(ctx, directDescKeys, entities); err != nil { 
    // handle error 
} 
関連する問題