数据存储:是否有计划添加GQLQuery支持?

时间:2015-06-21 01:57:33

标签: google-cloud-datastore gcloud-python google-cloud-python

我正在使用gcloud-python库来处理需要提供以下用例的项目:

  • 获取一批具有其属性子集(投影)的实体
  • gcloud.datastore.api.get_multi()为我提供批量获取但不提供投影
  • gcloud.datastore.api.Query()为我提供了投影但不是批量获取(如IN查询)

AFAIK,GQLQuery提供IN查询(批量获取)和投影。有计划在gcloud-python库中支持GQLQueries吗?或者,是否有另一种方法可以在单个请求中进行批处理和投影?

1 个答案:

答案 0 :(得分:3)

目前无法请求实体属性的子集。如果您拥有所需的密钥列表,则应使用get_multi()

投影查询背景

在数据存储区中,投影查询只是索引扫描。

例如,假设您正在编写查询SELECT * FROM MyKind ORDER BY myFirstProp, mySecondProp。此查询将针对索引执行:Index(MyKind, myFirstProp, mySecondProp)。该索引可能类似于:

myFirstProp | mySecondProp | __key__
------------------------------------
a             1              k1
a             2              k2
b             1              k3

对于索引中的每个结果,数据存储区然后查找与该索引结果关联的键。如果您执行仅投影myFirstPropmySecondProp或两者的投影查询,则数据存储可以避免执行随机访问查找以查找每个结果的关联实体。通常情况下,您可以通过使用预测获得巨大的性能提升 - 而不是通过网络传输而节省的成本。

同样,如果你知道你需要的密钥列表,你可以直接查找密钥 - 不需要先查看索引。

IN运算符

在Python GQL(not in the similar Cloud Datastore GQL)中,有IN运算符,它允许您编写类似于以下内容的查询:

SELECT * FROM MyKind WHERE myFirstProp IN ['a', 'b'].

但是,Datastore实际上并不支持此查询。在python客户端内部,这将转换为disjunctive normal form

SELECT * FROM MyKind WHERE myFirstProp = 'a'
UNION
SELECT * FROM MyKind WHERE myFirstProp = 'b'

这意味着对于IN中的每个值,您将发出单独的数据存储区查询。