Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 如何在Google App Engine中获得数据存储模型中的行数?_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Google app engine 如何在Google App Engine中获得数据存储模型中的行数?

Google app engine 如何在Google App Engine中获得数据存储模型中的行数?,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我需要在App Engine上获取特定型号的记录计数。怎么做 我批量上传了4000多条记录,但modelname.count()只显示了1000条记录。从1.3.6版开始,计数查询的上限不再是1000条。因此,您可以执行以下操作以获得超过1000的计数: count = modelname.all(keys_only=True).count() 这将计算所有实体的数量,如果您有大量实体,这可能会非常慢。因此,您应该考虑调用 COUNTHER()/指定的限制: count = modelname

我需要在App Engine上获取特定型号的记录计数。怎么做


我批量上传了4000多条记录,但modelname.count()只显示了1000条记录。

从1.3.6版开始,计数查询的上限不再是1000条。因此,您可以执行以下操作以获得超过1000的计数:

count = modelname.all(keys_only=True).count()
这将计算所有实体的数量,如果您有大量实体,这可能会非常慢。因此,您应该考虑调用<代码> COUNTHER()/<代码>指定的限制:

count = modelname.all(keys_only=True).count(some_upper_bound_suitable_for_you)

在GAE中,当您有1000多个对象时,计数将始终使您翻阅结果。处理此问题的最简单方法是将计数器属性添加到模型或其他计数器表中,并在每次创建新对象时更新它

我的count仍然达到了1000的上限,因此修改了dar的代码(我的代码有点快而且脏):

类GetCount(webapp.RequestHandler):
def get(自我):
query=modelname.all(仅键=True)
i=0
尽管如此:
结果=query.fetch(1000)
i=i+len(结果)
如果len(结果)<1000:
打破
cursor=query.cursor()
带光标的查询(光标)
self.response.out.write(“Count:”+str(i)+“

”)
为了补充dar之前的文章,必须指定“某个上限”。否则,默认计数仍将最大为1000

您应该使用:

请注意,上面的内容在开发数据存储中不起作用,但在生产中起作用(发布时)


我看到这是一篇老文章,但我添加了一个答案,以便于其他人搜索相同的内容。

这是一条非常古老的线索,但为了帮助其他人查看,有3种方法可以实现这一点:

  • 访问数据存储统计信息
  • 在数据存储中保留计数器
  • 切分计数器

  • 这些方法中的每一种。

    另一种解决方案是使用仅键查询并获取迭代器的大小。此解决方案的计算时间将随入口数量线性增加:

    Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
    KeyFactorykeyFactory = datastore.newKeyFactory().setKind("MyKind");
    Query query = Query.newKeyQueryBuilder().setKind("MyKind").build();
    int count = Iterators.size(datastore.run(query));
    

    300毫秒?你从哪里得到这个数字的?无论如何,这说明了为什么在飞行中计算物体不是一个好主意。我猜他指的是30000毫秒。但事实并非如此,因为如果你这么做是因为大容量上传程序,你可能只是在远程api上运行计数,而AFAIK不受30秒超时的限制faster@dar,远程_api中的计数仍受30秒超时的影响。远程api脚本本身不受超时限制,但单个api调用仍然受超时限制。@ryan我知道,这就是我为什么这么说的原因。回答得好。我查看了日志时间,如果更新不太频繁,使用memcache缓存结果似乎也是合理的。只是为了澄清一下,将“SomeEntity”替换为您希望获得计数的名称,其他一切都保持不变。此外,这仅在运行deployed时有效,entityStat在本地运行时将返回为null。我在代码的第一行遇到此错误:“无法实例化类型查询”有什么想法吗?这只返回我的一些实体,即使是那些“计数”字段也是错误的。有没有办法强制刷新统计数据?统计数据每天收集一次(甚至每48小时收集一次),正如这里所说的:因此可能会发生统计数据计数与实际计数不匹配的情况。甚至,据说统计数据不能用于大型数据集。。。
    count = modelname.all(keys_only=True).count(some_upper_limit)
    
    Query query = new Query("__Stat_Kind__");
    query.addFilter("kind_name", FilterOperator.EQUAL, kind);       
    Entity entityStat = datastore.prepare(query).asSingleEntity();
    Long totalEntities = (Long) entityStat.getProperty("count");
    
    DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
    Query query = new Query("__Stat_Kind__");
    Query.Filter eqf = new Query.FilterPredicate("kind_name",
                                    Query.FilterOperator.EQUAL,
                                    "SomeEntity");
    query.setFilter(eqf);
    Entity entityStat = ds.prepare(query).asSingleEntity();
    Long totalEntities = (Long) entityStat.getProperty("count");
    
    Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
    KeyFactorykeyFactory = datastore.newKeyFactory().setKind("MyKind");
    Query query = Query.newKeyQueryBuilder().setKind("MyKind").build();
    int count = Iterators.size(datastore.run(query));