2012-07-30 59 views
0

我在GAE上有一個應用程序,允許用戶將\編輯帖子添加到任何任意路徑(如wiki)。我將所有帖子存儲在一張表中。該表的結構如下:爲每個網址選擇最新帖子

class WikiPosts(db.Model): 
    path = db.StringProperty(required = True) 
    content = db.TextProperty(required = True) 
    date_created = db.DateTimeProperty(auto_now_add = True) 

在主頁上我想顯示每個路徑的最新帖子。

我的問題與此類似(Select first row in each GROUP BY group?),但答案涉及使用GAE中不可能的連接。

我可以有一個專門的字段來跟蹤每個url的最新帖子,但是可以使用gql查詢嗎?

截至目前,我正在使用這個查詢,它返回按照創建時間排序的所有wiki帖子的所有版本。

db.GqlQuery("SELECT * FROM WikiPosts ORDER BY date_created DESC limit=10") 
+0

您是否有存儲在別處的所有路徑的唯一列表?如果是這樣,你可以爲每個路徑查詢並獲取最新的。這會導致更多的操作,但可能會比嘗試計算獨立路徑更快。 – Sologoub 2012-07-30 18:08:18

+0

不,我沒有這樣的列表。我只有WikiPosts表。 – 2012-07-31 11:07:41

回答

1

既然你沒有的路徑的單獨的列表,因爲GAE不支持SQL的SELECT DISTINCT的當量(見hereherehere),你必須

  1. 生成列表每次顯示主頁時(不建議一次超過幾百個帖子)或
  2. 創建另一個表格/模型以追蹤添加新帖子時的唯一路徑(然後將此新表格與Shay的答案組合使用)或
  3. 如您所述,請保留tr每條路徑的最新帖子的答案。

我想選擇3是你最好的選擇,因爲(這是常有與GAE的情況下),你會投入數據存儲你想擺脫(即做寫有利於更復雜的到底是什麼快速閱讀。)

+0

謝謝,我會再添加一個新字段 – 2012-08-01 14:51:11

0

您可以撥打:

def get_latest_posts(amount=10): 
    return db.GqlQuery("SELECT * FROM WikiPosts where path =:1 ORDER BY date_created DESC limit=:2", path, amount) 

這將返回每個路徑將最新的帖子。

+0

我應該爲路徑變量分配什麼值?我沒有任何路徑列表。 – 2012-07-31 11:13:16

0

有很多問題與每個頁面訪問做查詢相關。當然,您可能擁有更多的實例,並且必須與支持查詢的索引的最終一致性相抗衡。既然你的頁面只是前十名單,爲什麼不簡單地用一個memcache對象來管理呢?如果找不到該對象,則執行查詢並編寫缺少的memcache對象。發佈列表更新將在實體put()之前寫入/重寫memcache - 這可能是延遲函數(任務隊列)的良好候選者。