2012-03-24 2 views
0

次のコードでは、フィルタではなくフィールドで注文できないため、実行時にFirst ordering property must be the same as inequality filter propertyエラーが発生します。Google App Engineの異なるフィールドでフィルタリングしてソート

q = Score.all() 
q.filter("levelname = ", levelname) 
q.filter("submitted >", int(time.time()) - (86400*7)) 
q.order("-score") 
scoreList = q.fetch(10) 

私がする必要があるのは、1週間未満のトップ10スコアを見つけることです。 10以上のスコアがあるとすれば、それらをすべて取り出してPythonで並べ替えることはできません。

これを行う方法はありますか?

答えて

2

一般的に、カウントの問題が発生するたびに、合意は、GAEを使用してできることをすべて事前に計算する必要があるということです。私があなたの特定のトップ10スコアの必要性に近づく方法は、トップスコアを上回る新しいスコアを持つたびにトップスコアを保持し、ポジションを更新するエンティティを作成することです。

スコアを計算するとき、計算されたスコアよりもいくつの他のスコアが高いかを照会することができます。カウントが10を超える場合は、スコアを更新する必要はありません。これは大半の時間です。カウントが10以上の場合は、注文を更新する必要がありますので、トップ10を獲得して新しいスコアを適切に挿入してください。

時間コンポーネントを処理するには、スコアをトップ10から削除する必要があるかどうかを確認するために毎日チェックを実行するプロセスを用意しておきます。ここで

は、GAEデータストアのための適切な設計パターンとロジックを扱う同様のテーマに関する回答の束です:What's the best way to count results in GQL?

0

Sologoubは述べているように、事前計算が進むべき道です。

しかし、多くの平等フィルタを使用することができます。トップスコアの別のリストを保持する代わりに、各エンティティにフラグ(たとえばブール値)を設定して、トップスコアリスト(あなたの場合は1週間以上経過していない)、適格性フラグを持つすべてのエンティティのリストを取得し、日付をチェックし、必要に応じてフラグを変更する毎日のcronジョブがあります。

これはストレージ容量(エンティティごとに1つのフィールドが増えます)がかかりますが、返すトップスコアの数を動的に選択できる利点があると思います。 (これらのフラグのいくつかを持つこともできます。たとえば、すべての時間のハイスコア、最後の1週間など)