GQL 查询问题,Google 数据存储。多个条件以及大于和小于运算符的错误

Issues with GQL query, Google Datastore. Error with multiple conditions and greater than and less than operators

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

SELECT *
FROM mydb
WHERE Latitude = "18.1" AND Number > "1"

不过没用。我在数据存储查询框中收到此错误:

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

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

no matching index found. recommended index is:\n- kind: mydb\n properties:\n - name: Location\n - name: Number\n

像这样的简单请求有效:

SELECT *
FROM mydb
WHERE Number > "1" AND Number < "5"

我在这里只访问一个列,也许这就是为什么?

不,

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

SELECT *
FROM mydb
WHERE Latitude = "18.1" AND Number = "1"

这有效。

我试图查找解决方案,然后我看到了这个页面: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);

您收到的错误是因为您尝试的查询需要 Composite indexes 默认情况下不可用。它们必须在 index.yaml.

内指定

这篇文章 Creating index files 与发布的文章有些不同,专门针对 Java 灵活环境中的应用程序 运行。

有 2 种方法可以创建 index.yaml:

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

然后,一旦您拥有 index.yaml 和与 app.yaml 相同的目录,您就可以从该目录使用 gcloud preview app deploy index.yaml 部署它。 Deploying the index file.

中简要记录了此过程

我还建议阅读 Organizing yaml Configuration Files

如果您对此主题仍有疑问。确保您在 index.html 上添加的属性正是您需要的 。在我的例子中,我添加了两个数字属性,因为 Datastore 不允许多个不等运算符(大于等),你不能同时查询这两个。

所以我上传了一个新的index,其中只有一个,它允许我进行查询。

希望对您有所帮助,

干杯!