GAE查询计数器(+1000)

时间:2010-08-30 03:53:42

标签: google-app-engine cursor google-cloud-datastore

如何将此查询计数器实现到现有类中?主要目的是我拥有超过3000条记录的成员的数据存储模型。我只是想计算它的总记录,并在应用程序引擎菜谱上找到了这个:

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的经验吗?

1 个答案:

答案 0 :(得分: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()))

如果您希望组中有大量成员,您还可以使用由该组进行分片的计数器模型来更有效地执行此操作。