0

現在、DataStore を使用する AppEngine アプリケーションのモデル構造は次のとおりです (わかりやすくするために省略しています)。

class User(db.Model):
    name = db.StringProperty()
class Game(db.Model):
    name = db.StringProperty()
class UserGame(db.Model):
    user = db.ReferenceProperty(User)
    game = db.ReferenceProperty(Game)
    high_score = db.IntegerProperty()

多くのゲームがあり、多くのユーザーがいます。(疑似) SQL に相当するものと同様に、ユーザーが参加していないゲームのリストをクエリしようとしていますSELECT * from Game where name NOT IN (SELECT * from UserGame where user = <<current_user>>)

私の最初のアプローチは、UserGames のリストを取得し、そのリストを繰り返し処理して追加すること.filter('__key__ !=',<<user_key>>)でしたが、不等式フィルターをチェーンすることはできません。

私の質問は、私が必要とするデータを取得するために人々が想像できるより良いモデリングのアイデアはありますか、それともすべてを CloudSQL に移行する必要があるかということです。現在使用しているモデルを使用して、データストア レベルでこの情報を取得する方法がわかりません。

そのユーザーの UserGame のリストを保持し、Game.all() を取得し、プログラムで結果を除外することで、プログラムでこれを実行できることはわかっていますが、Cursor を使用したいので、これは理想的ではありません。結果を改ページします。

助けてくれてありがとう!

4

3 に答える 3

1

高速射影クエリを使用して、ユーザーのゲーム キーのリストを取得できます。すべてのゲーム キーのリストがあれば、Python セットを使用して答えを見つけることができます。すべてのゲーム キーのリストを取得するには、高速な key_only クエリを実行し、さらに最適化する必要がある場合はこのリストを保存 (ピクル) します。

そして、ここに appengine に関する素晴らしいビデオがあります: SQL vs NoSQL: バックエンドの戦い https://developers.google.com/events/io/sessions/gooio2012/306/

于 2012-11-02T15:44:43.730 に答える
0

わかりました、私はこれを理解しました。文書化されていない__key__プロパティを使用してクエリをフィルタリングする必要があることがわかりました。基本的に、次のように、DataStore を使用して、最初にフィルターで除外するエンティティをクエリします。

joined_list = models.UserGame.all()
joined_list.filter('user =', <<current_user>>)

!=次に、それを反復処理し、次のようにを使用して除外します。

for joined in joined_list:
    games.filter('__key__ !=', joined.key())

ここでの唯一の問題は、他のプロパティでは不等式を使用できないことです (DataStore の制限)。

これにより、ユーザーがまだ参加していないすべてのゲームのリストが表示されます。

これが他の誰かに役立つことを願っています!

于 2012-11-03T18:19:11.737 に答える
0

ゲームが修正されている場合、これを行う「別の」方法がある可能性があります。具体的には、ゲームが時間内に変化しない場合、Userすべてのゲームを含むプロパティでモデルを初期化し、ユーザーが参加するゲームごとにリストから削除できます。したがって、参加していないゲームのリストを常に持つことができます。

また、大量の書き込み操作を避けるために、このプロパティをインデックスなしにすることもできます。

于 2012-11-02T20:51:47.427 に答える