2010-08-30 35 views
1

如何在現有類中實現此查詢計數器?主要目的是我擁有超過3000條記錄的成員數據存儲模型。我只是要算它的總記錄,發現這個在App Engine上的菜譜:GAE查詢計數器(+1000)

def query_counter (q, cursor=None, limit=500): 
    if cursor: 
     q.with_cursor (cursor) 
    count = q.count (limit=limit) 
    if count == limit: 
     return count + query_counter (q, q.cursor(), limit=limit) 
    return count 

我現有的模式是:

class Members(search.SearchableModel): 
    group = db.ListProperty(db.Key,default=[]) 
    email = db.EmailProperty() 
    name = db.TextProperty() 
    gender = db.StringProperty() 

而且我想數着加入某些組列表引用成員。它也可能包含超過1000條記錄。

任何人都有經驗query.cursor爲此目的?

+0

你到底在問什麼?如何在你已經寫過的Model類中使用這段代碼? – 2010-08-30 12:23:25

+0

是的,有現有的模型被計算。 – 2010-08-30 12:57:13

回答

2

要找到你會使用這樣的所有成員:

num_members = query_counter(Members.all()) 

但是,你可能會發現,這個運行的很慢,因爲它使得大量數據存儲的調用。

更快的方法是創建一個單獨的模型類(例如MembersCount),並在其中保持計數(即,當您創建成員時加1,刪除成員時減1)。

如果要創建和刪除成員頻繁,你可能需要以創建一個分片計數器以獲得更好的性能 - 在這裏看到的細節:

http://code.google.com/appengine/articles/sharding_counters.html

要在某一組數的成員,你可以做這樣的事情:

group = ... 
num_members = query_counter(Members.all().filter('group =', group.key())) 

如果您期望擁有大量成員的組中,你也能做到這一點更有效地利用反模型,該模型是由組分片。

+0

也許我可以在初始會員數上使用這個,然後我可以用分片計數器維持下一個計數圈,謝謝撒克遜。 – 2010-08-31 03:09:04