6

エンティティa、b、cがすべて同じタイプであり、状況は次のようになっているとします。

エンティティaはエンティティbの親ですエンティティbはエンティティcの親です

今、私が次のクエリを実行すると

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

結果には、bエンティティとcエンティティの両方が含まれます。直接の子孫であるエンティティのみが残るようにcを除外する方法はありますか?私とは別に、結果を調べて削除するということです。

4

3 に答える 3

4

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

于 2012-04-19T03:36:56.237 に答える
1

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

「種類のないクエリにプロパティのフィルタを含めることはできません。ただし、フィルタのプロパティ名としてEntity.KEY_RESERVED_PROPERTYを渡すことで、エンティティキーでフィルタリングできます。Entity.KEY_RESERVED_PROPERTYでの昇順の並べ替えもサポートされています。」

于 2012-05-18T10:48:39.410 に答える
0

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

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

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

私はPythonに慣れていないので、goの例を次に示します。

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
}
于 2016-04-14T02:44:55.450 に答える