如何在 GQuery 中使用投影属性和相等过滤器?

How to use projection properties along with equality filter in GQuery?

我的 gquery 是这样的:

SELECT  Distinct Path,Value FROM Entity WHERE PID="chichi"

我收到错误消息

GQL query error: Your Datastore does not have the composite index (developer-supplied) required for this query.

我知道我正在使用带有相等查询的投影,我在 index.yaml(复合索引文件)中添加了路径、值和计划 ID。如何在 gcloud 数据存储上执行此查询?

我已经在 index.yaml 文件中包含了所有可能的组合

index.yaml:
indexes:
- kind: Entity
  properties:
  - name: PID  
  - name: Value
  - name: Path

我已经能够自己重现您的错误,创建一组具有您指定的属性的实体。正如您所指出的,为了消除错误,我必须创建一个 index。同时使用多个属性的查询不会自动定义为索引,因此必须手动对其进行索引。索引是在 index.yaml 文件中定义的,它应该看起来像这样:

indexes:
- kind: Entity
  properties:
  - name: PID
  - name: Path
  - name: Value

当然,它可以包含更多索引,以防您使用任何其他不同的索引。创建此 index.yaml 文件后,您可以使用 following command:

将其上传到您的项目
gcloud datastore create-indexes index.yaml

加载需要一些时间,但一旦准备就绪,您将能够在 Datastore > Indexes tab in the Console:

中找到它

一旦显示绿色勾号,索引就可以使用了,您可以使用 GQL 查询您的数据存储区内容:

请记住,有一些 best practices 推荐用于定义索引,您应该考虑最重要的一个(为了 运行 最佳查询):

The perfect index for a query, which allows the query to be executed most efficiently, is defined on the following properties, in order:

  1. Properties used in equality filters
  2. Property used in an inequality filter
  3. Properties used in sort orders

因此请确保您的索引配置与我共享的一样,并且已正确上传到您的项目中。

最后,Datastore 中有一些 limitations to projection queries,您的查询似乎不属于其中任何一个,因此在这种情况下这应该不是问题。