如何对 Google Datastore 中的大量实体进行求和?

问题描述 投票:0回答:3

我想了解 Google Datastore 是否可以满足我的需求。

我有很多实体,我需要对某个财产进行求和。 基本上,我希望能够做到

select count(value1) from entity1 where [some filter]
,entity1 是一个实体,它跟踪其字段/属性中的某种数据
value1

我知道这些类型的函数在数据存储中不可用,因为它不是关系数据库,因此最直接的解决方案是执行

select
,然后计算应用程序中结果集的总和。所以我会有类似的东西(使用nodejs,但我不关心语言):

query = client.query(kind='Task')
query.add_filter('done', '=', False)
results = list(query.fetch())

total = 0
for(v in results)
  total += v.value

问题是我有数千条记录,因此结果可能约为 300 000 条记录。

在不出现瓶颈的情况下执行此操作的最佳方法是什么?

node.js google-app-engine google-cloud-datastore datastore
3个回答
1
投票

您可以将总金额存储在单独的实体中。无论用户请求的频率如何,您都可以在几毫秒内返回。

当包含在总计中的实体发生更改时,您就更改了总计实体。例如,如果属性从 300 更改为 500,您会将总数增加 200。这样您的总数始终是准确的。

如果更新非常频繁,您可以将这些更新作为任务(任务队列 API)实现,以防止竞争情况。这些任务将非常快速地执行,因此您的用户每次询问时都会得到非常“新鲜”的总数。


0
投票

也许依赖 Google Datastore 的最佳方法是官方解决方案:Shard Count


0
投票

数据存储中的 SUM 聚合现已普遍可用。

有多种语言的客户端库支持此特定功能。

通过聚合查询,用户可以避免执行客户端聚合,这会带来增加出口成本的额外负担。也不需要使用像cloud-functions这样的替代方案来更新后端的聚合值,这有其自身的成本限制。

© www.soinside.com 2019 - 2024. All rights reserved.