GQL查询的问题,Google Datastore.多个条件以及大于和小于运算符时出错

A B*_* Ba 6 java google-app-engine gql google-cloud-datastore app-engine-flexible

我正在尝试查询数据存储区,我的查询如下所示:

SELECT *
FROM mydb
WHERE Latitude = "18.1" AND Number > "1"
Run Code Online (Sandbox Code Playgroud)

它不起作用.我在数据存储区查询框中收到此错误:

GQL查询错误:您的数据存储区没有此查询所需的复合索引(开发人员提供).

运行我的代码时出现此错误:

找不到匹配的索引.推荐索引是:\n-种类:mydb \n属性:\n - 名称:位置\n - 名称:数字\n

像这样的简单请求工作:

SELECT *
FROM mydb
WHERE Number > "1" AND Number < "5"
Run Code Online (Sandbox Code Playgroud)

我这里只访问一个列可能这就是为什么?

不,

然后我尝试了这样的请求:

SELECT *
FROM mydb
WHERE Latitude = "18.1" AND Number = "1"
Run Code Online (Sandbox Code Playgroud)

这很有效.

我尝试查找解决方案,但我遇到了此页面:https://cloud.google.com/datastore/docs/tools/indexconfig#Datastore_About_index_yaml

经过那个页面后,我收集到了我需要一个index.yaml文件.它应该放在一个名为WEB-INF的文件夹中.但我没有这个文件夹.

这是我的代码的一小部分:

Query<Entity> query = Query
                .gqlQueryBuilder(Query.ResultType.ENTITY,
                        "SELECT * FROM " + kind + " WHERE Location = @location AND Number <= @number")
                .setBinding("number", "5").setBinding("location", "18.1").build();
QueryResults<Entity> results = datastore.run(query);
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 5

您得到的错误是因为您尝试的查询需要默认情况下不可用的复合索引。它们必须在index.yaml.

文章创建索引文件与发布的有些不同,它专门针对在柔性环境中运行的 Java 应用程序。

有两种方法可以创建一个index.yaml

  1. 按照索引定义中规定的规则和结构手动使用您喜欢的文本编辑器。
  2. 在本地测试时生成文件。这可以使用gcloud beta emulators datastore start命令来完成。您还可以使用该--data-dir <dir>选项来指定index.yaml应将生成的内容写入何处。

然后,一旦您拥有index.yaml与 相同的目录app.yaml,您就可以gcloud preview app deploy index.yaml从该目录部署它。部署索引文件中简要记录了此过程。

我还建议阅读组织 yaml 配置文件