【问题标题】:Datastore: Is there plan to add GQLQuery support?数据存储:是否有计划添加 GQLQuery 支持?
【发布时间】:2015-06-21 01:57:33
【问题描述】:

我正在将gcloud-python 库用于需要服务于以下用例的项目:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    投影查询背景

    在 Datastore 中,投影查询只是索引扫描。

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

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

    对于索引中的每个结果,Datastore 会查找与该索引结果关联的键。如果您执行投影查询时仅投影 myFirstPropmySecondProp 或两者,Datastore 可以避免执行随机访问查找来查找每个结果的关联实体。这通常是您通过使用预测获得巨大性能提升的地方 - 而不是通过网络传输它的节省。

    同样,如果你知道你需要的键列表,你可以直接查找键——不需要先在索引中查找。

    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 中的每个值,您将发出单独的数据存储区查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 2021-11-20
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 2021-05-05
      • 2012-01-22
      相关资源
      最近更新 更多