2012-03-24 61 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) 

我需要做的是找到不到一週大的前10個分數。可能會有成千上萬(如果不是更多)分數,所以我不能只抓取它們並按python排序。

有沒有辦法做到這一點?

回答

2

一般而言,每次出現計數問題時,共識是GAE您應該預先計算所有可能的數值。按照您對特定要求的前10個分數的方式,創建一個持有最高分數的實體,並在新分數超過前10時更新位置。

當您計算分數時,您可以查詢有多少其他分數大於計算得分。如果計數超過10,則不需要更新分數。這將是大部分時間。如果計數等於或大於10,則需要更新訂單,因此您可以獲得前10名並根據需要插入新分數。

爲了處理時間部分,我會有一些進程運行,每天檢查是否應該從前10位驅逐分數,如果是這樣,請抓住下一個最高以替換它。

這裏有答案的一個類似的課題,解決設計模式和邏輯適合GAE數據存儲一串:What's the best way to count results in GQL?

0

由於Sologoub提到,預先計算是要走的路。

儘管如此,您可以使用許多平等過濾器,因此保留最高分數的單獨列表的替代方案可能是讓每個實體都有一個標誌(比如布爾值),表明它是否符合條件最高分數列表(在您的情況下,不超過一週),並且每天都有一個cron作業,用於檢索具有合格標誌的所有實體列表,檢查日期並根據需要更改標誌。

這會花費更多的存儲空間(每個實體多一個字段),但我認爲一個優勢可以是您可以動態選擇要返回的最高分數。 (你也可以有幾個這樣的標誌,比如所有時間高分和最後一週等等)

相關問題