1

Google App Engine NDB を使用しており、次のクエリを実行しようとしています。

query = Club.query(ndb.OR(
ndb.AND(Club.memberIds == userId, Club.modifiedDate > date), 
ndb.AND(Club.activityDate > date, ancestor = userKey)
))

ただし、実行時エラーが発生します。

TypeError: __new__() got an unexpected keyword argument 'ancestor'

それは先祖の位置と関係があります。この回答は、ある場合の解決策を指摘することができましたが、祖先が実際の AND 句にあるため、その解決策はここでは適用されません。

  1. このクエリを再フォーマットして機能させるにはどうすればよいですか?
  2. このクエリは悪い考えですか? 複雑すぎませんか?その複雑さのために、通常よりも追加の読み取りコストがかかりますか?
4

2 に答える 2

1

祖先をフィルターの一部として使用することはできません。query()呼び出しで直接キーワードパラメータである必要があります。現在、ORクエリはとにかく複数のクエリに変換されるため、OR()メソッドが提供する唯一の利点は、結果を簡単に組み合わせることができることです。しかし、それが機能するためには、とにかくキーで並べ替える必要があり、キーで並べ替えられた2セットのクエリ結果をマージする小さなマージ関数を作成するのは簡単です。(ndb.query._MultiQuery()を呼び出すことでそれを行うことも可能ですが、後者は文書化されたAPIではなく、正しく実行するのが難しいため、これを自分で行う方がおそらく良いでしょう。)

于 2012-09-19T22:09:09.027 に答える
1

GQL を使用するようにクエリを書き直すことは可能ですか?

編集

自分の提案を打ち砕くために。GQL を使用するようにクエリを書き直すことはできません。GQL はサポートしていませんOR

参照: https://developers.google.com/appengine/docs/python/datastore/gqlreference

提案 先祖オブジェクトもモデル属性として変更すると、必要なクエリを実行できます。例えば

class Club(ndb.Model):
    parent = ndb.KeyProperty()
于 2012-09-19T16:36:43.557 に答える