首页 文章

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

提问于
浏览
6

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

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

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

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

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

找不到匹配的索引 . 推荐索引是:\ n-种类:mydb \ n属性:\ n - 名称:位置\ n - 名称:数字\ 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);

1 回答

  • 2

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

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

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

    • 按照Index definitions中规定的规则和结构手动使用您喜欢的文本编辑器 .

    • 在本地测试时生成文件 . 这可以使用 gcloud beta emulators datastore start 命令完成 . 您还可以使用 --data-dir <dir> 选项指定应在何处编写生成的 index.yaml .

    然后,一旦你有 index.yamlapp.yaml 相同的目录,就可以从该目录中使用 gcloud preview app deploy index.yaml 进行部署 . 此过程简要记录在Deploying the index file中 .

    我还建议阅读Organizing yaml Configuration Files .

相关问题