bar*_*ron 29 google-app-engine gql gqlquery
我认为计算的一种方法是这样的:
foo = db.GqlQuery("SELECT * FROM bar WHERE baz = 'baz')
my_count = foo.count()
Run Code Online (Sandbox Code Playgroud)
我不喜欢的是我的数量将限制在1000以上,我的查询可能会很慢.那里的人有解决方法吗?我有一个想法,但它感觉不干净.如果只有GQL有一个真正的COUNT函数......
Jeh*_*iah 20
在使用像GAE这样的可扩展数据存储区时,您必须提前考虑进行计算.在这种情况下,这意味着您需要为每个计数器保留计数器,baz并在添加新bar计数时递增它们,而不是在显示时计数.
class CategoryCounter(db.Model):
category = db.StringProperty()
count = db.IntegerProperty(default=0)
Run Code Online (Sandbox Code Playgroud)
然后在创建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')
Run Code Online (Sandbox Code Playgroud)
现在,您可以轻松获取任何特定类别的计数
CategoryCounter.filter('category =',category_name).get().count
Run Code Online (Sandbox Code Playgroud)
所有数据库中的计数函数都很慢(例如,O(n)) - GAE数据存储区使这一点变得更加明显.正如Jehiah建议的那样,您需要将计算出的计数存储在实体中,如果您想要可伸缩性,请参考该计数.
这并不是App Engine独有的 - 其他数据库只是更好地隐藏它,直到你试图用每个请求计算成千上万条记录,并且你的页面渲染时间开始呈指数增长...
| 归档时间: |
|
| 查看次数: |
23806 次 |
| 最近记录: |