我正在GAE上构建一个需要报告发生事件的应用程序。一个事件有一个类型,我还需要按事件类型报告。
例如,假设存在事件A,B和C.它们是随机发生的。用户登录并创建一组可以归因于这些事件的实体。当用户回来检查状态时,我需要能够告知在特定时间范围(例如一天或一个月)内发生了多少A,B和/或C事件。
1000限制正在扼杀我通常如何做到这一点。我不需要检索所有实体并将它们呈现给用户,但我需要显示特定日期范围的总计数。有什么建议吗?
我有点像python / GAE noob ...
答案 0 :(得分:7)
App Engine不是关系数据库,您无法像这样快速进行计数。最好的方法是在写入时更新计数,而不是在读取时生成它们。
生成计数时,有两种通用方法可以很好地扩展App Engine以最大限度地减少写入争用:
答案 1 :(得分:3)
数据存储计数()查询的结果 和所有数据存储区查询的偏移量 不再限制在1000。
自版本1.3.6起
答案 2 :(得分:0)
我的方法是建立一个或多个聚合模型来跟踪事件类型,日期和计数。不过,考虑到你的要求,我不是100%你应该如何建模。
然后,我会触发延迟任务,以便在用户执行触发事件的事情时异步更新相应的聚合模型。
Nick Johnson的Background work with the deferred library文章提供了更多信息,并提供了一个框架,您可能会发现这种框架对于您正在谈论的那种聚合非常有用。
答案 3 :(得分:0)
solution使用游标(如下所示)会为你工作吗?我个人使用这种方法来计算类似于你的场景中的条目数,并且还没有看到任何问题(尽管我按计划运行,因为不断查询数据存储对CPU配额非常重要) )。
def count(query):
i = 0
while True:
result = query.fetch(1000)
i = i + len(result)
if len(result) < 1000:
break
cursor = query.cursor()
query.with_cursor(cursor)
return i
答案 4 :(得分:0)
这篇文章很老了,但我想提供一个有用的参考。 App Engine现在提供了一个用于访问数据存储区统计信息的内置API:
对于Python,
from google.appengine.ext.db import stats
global_stat = stats.GlobalStat.all().get()
print 'Total bytes stored: %d' % global_stat.bytes
print 'Total entities stored: %d' % global_stat.count
对于Java,
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Query;
// ...
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Entity globalStat = datastore.prepare(new Query("__Stat_Total__")).asSingleEntity();
Long totalBytes = (Long) globalStat.getProperty("bytes");
Long totalEntities = (Long) globalStat.getProperty("count");
也可以仅针对特定种类过滤实体编号。看一下这个参考:
https://developers.google.com/appengine/docs/python/datastore/stats https://developers.google.com/appengine/docs/java/datastore/stats
答案 5 :(得分:-1)
这听起来与我在StackOverflow上提出的问题非常相似。
How to get the distinct value of one of my models in Google App Engine我需要知道如何为模型中的实体获取不同的值,并且该模型将有超过1000个实体。
希望有所帮助。