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

时间:2018-02-02 05:51:40

标签: google-app-engine google-cloud-datastore 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

1 个答案:

答案 0 :(得分:1)

我已经能够自己创建一组具有您指定属性的实体来重现您的错误。为了摆脱错误,正如你所指出的那样,我必须创建一个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中找到它:

enter image description here

显示绿色勾号后,索引就可以投放了,您可以使用GQL查询数据存储内容:

enter image description here

请记住,建议使用best practices来定义索引,并且应该考虑最重要的索引(为了运行最佳查询):

  

查询的完美索引,允许执行查询   效率最高,按以下属性定义:

     
      
  1. 在相等过滤器中使用的属性
  2.   
  3. 不等式过滤器中使用的属性
  4.   
  5. 排序顺序中使用的属性
  6.   

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

最后,数据存储区中有一些limitations to projection queries,您的查询似乎没有落入其中任何一个,因此在这种情况下不应该是一个问题。