2013-06-24 61 views
1

嗨我正在使用谷歌應用程序引擎來創建一個圖片託管網站,每個頁面擁有5張圖片,我想得到一個布爾,它會告訴我,如果有一個後續頁面(它們按降序排列)。我有一個頁面限制和一個頁碼,所以我需要的是一個數據存儲查詢,將:獲取基於日期降序與谷歌數據存儲的第n個rownum

獲取rownum pagenumber * pagelimit的單個值(檢查頁面5顯示後存儲的東西)。

目前我有:

Query query = new Query("PicturePost").addSort("date",Query.SortDirection.DESCENDING); 
    List<Entity> results; 

    results = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(pageLimit) 
            .offset(pageLimit*(pageNumber))); 

    boolean lastPage = results.isEmpty(); 

,但因爲它得到所有5個實體從下一個頁面,這將是低效的。

如果有人能幫助我,我會非常感激,謝謝!

回答

1

這對我來說似乎工作得很好。因人而異。我總是在任何需要串行訪問的實體上包含一個date_created字段[auto_now_add = True]。瀏覽器客戶端應該使用兩個輸入來調用處理函數:返回的number_of_images和date_limit。第一次調用將爲date_limit使用空字符串,因此您使用當前系統日期時間。其他呼叫將包括您在上次呼叫中返回的最早日期。

您的查詢將會是(date_created < date_limit)和date_created DESC。對所需圖像數進行keys_only提取,然後將密鑰發送回img src =「key_goes_here」設置。如果您返回的圖像數量少於所需數量,或者您的圖像數量爲零,則表示您的圖像沒有出現。

如果這是一個活動頁面,我肯定會使用ndb進行自動memcaching,並告訴瀏覽器將它緩存在您的內容頭文件中。 (如果使用db,您可以非常輕鬆地編寫簡單的memcache函數。)是的,這並不完美:由於您返回N張圖像,並且不知道下一次調用將返回零,所以很少時間會導致浪費的調用。如果超級活躍的網站,你可能有一個圖像put()的date_created重複。你有一個自定義索引的開銷,但我認爲無論採用什麼方法,你都會承擔這個成本。與許多GAE一樣,通常會進行折衷。 HTH。 -stevep

相關問題