5

クエリ操作のドキュメントにはIN、これらのクエリが大きな OR 演算された等価クエリとして実装されていると記載されています。

qry = Article.query(Article.tags.IN(['python', 'ruby', 'php']))

次と同等です。

qry = Article.query(ndb.OR(Article.tags == 'python',
                           Article.tags == 'ruby',
                           Article.tags == 'php'))

私は現在、GAE プロジェクトのいくつかのエンティティをモデル化しており、多くの可能な値を持つこれらのメンバーシップ クエリを使用する予定です。

qry = Player.query(Player.facebook_id.IN(list_of_facebook_ids))

list_of_facebook_ids何千ものアイテムがある可能性があります。

このタイプのクエリは、リスト内の数千の可能な値でうまく機能しますか? そうでない場合、これをモデル化するための推奨されるアプローチは何ですか?

4

2 に答える 2

8

これは、数千の値では機能しません (実際、値が 10 を超えると低下し始めるに違いありません)。私が考えることができる唯一の代替手段は、何らかの形式の事前計算です。スキーマを変更する必要があります。

于 2012-08-13T19:30:45.123 に答える
0

これを行う 1 つの方法は、インデックスである FacebookPlayer という新しいモデルを作成することです。これは facebook_id によってキー化されます。新しいプレーヤーを追加するたびに更新します。次のようになります。

class FacebookUser(ndb.Model):
    player = ndb.KeyProperty(kind='Player', required=True)

これで、クエリを完全に回避できます。あなたはこれを行うことができます:

# Build keys from facebook ids.
facebook_id_keys = []
for facebook_id in list_of_facebook_ids:
    facebook_id_keys.append(ndb.Key('FacebookPlayer', facebook_id))

keysOfUsersMatchedByFacebookId = []
for facebook_player in ndb.get_multi(facebook_id_keys):
    if facebook_player:
        keysOfUsersMatchedByFacebookId.append(facebook_player.player)
usersMatchedByFacebookId = ndb.get_multi(keysOfUsersMatchedByFacebookId)

list_of_facebook_ids が何千ものアイテムである場合、これをバッチで行う必要があります。

于 2014-03-03T01:51:28.563 に答える