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
:
- 按照 Index definitions 中规定的规则和结构手动使用您最喜欢的文本编辑器。
- 在本地测试时生成文件。这可以使用
gcloud beta emulators datastore start
命令来完成。您还可以使用 --data-dir <dir>
选项指定应将生成的 index.yaml
写入何处。
然后,一旦您拥有 index.yaml
和与 app.yaml
相同的目录,您就可以从该目录使用 gcloud preview app deploy index.yaml
部署它。 Deploying the index file.
中简要记录了此过程
如果您对此主题仍有疑问。确保您在 index.html
上添加的属性正是您需要的 。在我的例子中,我添加了两个数字属性,因为 Datastore 不允许多个不等运算符(大于等),你不能同时查询这两个。
所以我上传了一个新的index
,其中只有一个,它允许我进行查询。
希望对您有所帮助,
干杯!
我正在尝试查询数据存储,我的查询如下所示:
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
:
- 按照 Index definitions 中规定的规则和结构手动使用您最喜欢的文本编辑器。
- 在本地测试时生成文件。这可以使用
gcloud beta emulators datastore start
命令来完成。您还可以使用--data-dir <dir>
选项指定应将生成的index.yaml
写入何处。
然后,一旦您拥有 index.yaml
和与 app.yaml
相同的目录,您就可以从该目录使用 gcloud preview app deploy index.yaml
部署它。 Deploying the index file.
如果您对此主题仍有疑问。确保您在 index.html
上添加的属性正是您需要的 。在我的例子中,我添加了两个数字属性,因为 Datastore 不允许多个不等运算符(大于等),你不能同时查询这两个。
所以我上传了一个新的index
,其中只有一个,它允许我进行查询。
希望对您有所帮助,
干杯!