2010-08-30 96 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