我认为计算的一种方法是这样的:
foo = db.GqlQuery("SELECT * FROM bar WHERE baz = 'baz') my_count = foo.count()
我不喜欢的是我的数量将限制在1000以上,我的查询可能会很慢.那里的人有解决方法吗?我有一个想法,但它感觉不干净.如果只有GQL有一个真正的COUNT函数......
在使用像GAE这样的可扩展数据存储区时,您必须提前考虑进行计算.在这种情况下,这意味着您需要为每个计数器保留计数器,baz
并在添加新bar
计数时递增它们,而不是在显示时计数.
class CategoryCounter(db.Model): category = db.StringProperty() count = db.IntegerProperty(default=0)
然后在创建Bar对象时,递增计数器
def createNewBar(category_name): bar = Bar(...,baz=category_name) counter = CategoryCounter.filter('category =',category_name).get() if not counter: counter = CategoryCounter(category=category_name) else: counter.count += 1 bar.put() counter.put() db.run_in_transaction(createNewBar,'asdf')
现在,您可以轻松获取任何特定类别的计数
CategoryCounter.filter('category =',category_name).get().count
给耶和华的回应+1.
在GAE上获取对象计数器的官方和祝福方法是构建分片计数器.尽管声名鹊起,但这非常简单.
所有数据库中的计数函数都很慢(例如,O(n)) - GAE数据存储区使这一点变得更加明显.正如Jehiah建议的那样,您需要将计算出的计数存储在实体中,如果您想要可伸缩性,请参考该计数.
这并不是App Engine独有的 - 其他数据库只是更好地隐藏它,直到你试图用每个请求计算成千上万条记录,并且你的页面渲染时间开始呈指数增长...