在Google DataStore上使用限制/偏移时获取总行数

时间:2015-03-18 15:33:32

标签: python google-app-engine google-cloud-datastore app-engine-ndb

ListingStore.query().filter(ListingStore.account_id==1).fetch(10, offset=40)

以上是从我的数据集返回第5页结果的查询。 我的问题是我必须返回总行数,如下所示:

{
    "data": ...,
    "limit": 10,
    "offset": 40,
    "total": 1235
}

我可以使用count()获取total,如下所示:

ListingStore.query().filter(ListingStore.account_id==1).count()

但这似乎只需要运行fetch(),导致整个事情需要两倍的时间。

有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

.count() 比等效查询更有效,但只有一些常数因素(取决于每个实体的大小 - 与仅使用密钥的查询相比最低)。

您可以获得的唯一显着的性能加速是非正规化您的数据模型到#34;冗余"跟踪每个ListingStore的实体数量account_id

出于此目的,您可以引入一个新的实体ListingStoreByAccount,其中account_id作为密钥中的ID,因此可以非常快速地获取,IntegerProperty w /目前的数量。

您可能需要在每次创建或删除ListingStore实体时更新相应的实体,可能是在一次交易中(使用假的仅限密钥"父级" per { {1}}作为实体组)如果并发是另外一个问题。

如果反竞争成为问题,请转而使用高速分片计数器,例如https://cloud.google.com/appengine/articles/sharding_counters和示例代码https://github.com/GoogleCloudPlatform/appengine-sharded-counters-python

答案 1 :(得分:1)

除非您始终需要每account_id个计数,否则我会在需要时使用The Memcache Pattern运行count(),并为后续页面查询缓存结果。

然后,正如Alex提到的那样,在ListingStore更改时删除相应的缓存条目。