java - Google Cloud Datastore - 不等式返回 "no matching index found"
java - Google Cloud Datastore - Inequality returning "no matching index found"
在 Android Studio 中,我尝试使用 Google Clood Datastore Android应用
使用 Google 示例 https://cloud.google.com/datastore/docs/concepts/indexes#Datastore_Indexes_and_properties 我可以将 Tom(32 岁)和 Lucy(30 岁)添加为公司 Acme 的人员和 children。我可以看到这两个条目位于 Google 开发人员控制台的数据存储中。
如果我按如下方式设置查询过滤器,我可以从 Company Acme 检索 children。
Key acmeKey = makeKey("Company", "Acme").build();
makeFilter("__key__",
PropertyFilter.Operator.HAS_ANCESTOR,
makeValue(acmeKey)).build()));
- 如果我只想检索年龄等于 32 岁的人,我将添加到上面的过滤器
makeFilter("age", PropertyFilter.Operator.EQUAL, makeValue(32)).build()
然后,我得到了汤姆这个人。
- 但是,如果我没有使用
Operator.EQUAL
,而是使用 Operator.LESS_THAN
或 Operator.GREATER_THAN
之类的不等式过滤器,我会收到错误消息“ 未找到匹配索引".
我认为是索引的问题,但是我真的不明白如何设置索引。我使用 Android Studio,我根本不使用 App Engine。我只想像使用 MySQL 一样使用简单的 WHERE age > 32
.
检索数据
顺便说一句,我尝试使用 GQL,我遇到了完全相同的问题,使用 EQUAL
,但不使用 GREATER_THAN
(在 https://developers.google.com/apis-explorer 中也是如此)。
那么,有人知道我该如何解决这个问题吗?谢谢!!
Cloud Datastore 的索引配置是使用 gcd.sh 工具处理的。
如果您能够 运行 针对 gcd.sh
提供的本地数据存储进行查询,那将是最简单的。该工具可以准确确定您需要哪些索引,然后您可以使用 updateindexes
命令在您的生产应用程序上配置它们。
如果没有,也可以手动配置索引:
gcd.sh create <project> -d <project>
- 在
<project>/WEB-INF/datastore-indexes.xml
创建一个包含以下内容的文件:
<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes
autoGenerate="true">
<datastore-index kind="Company" ancestor="true">
<property name="age" direction="asc" />
</datastore-index>
</datastore-indexes>
gcd.sh updateindexes <project>
文件的确切内容将取决于您要运行的查询。 This page 提供了有关索引文件格式的更多详细信息。
所以,就像Ed Davisson刚才说的,一切都用gcd搞定了。
我花了很多时间才明白该怎么做,所以我把我的经验放在下面,也许对某人有帮助。我正在与 Ubuntu 合作,我不知道其他 OS.
- 在下载文件夹
中下载gcd-v1beta2-rev1-2.1.1.zip
- 解压缩下载的文件
- 在控制台中,转到解压缩的文件夹
cd Downloads/gcd-v1beta2-rev1-2.1.1
- 然后,
./gcd.sh create -d myDataset myProjectName
其中myDataset是Google Developers Console中的项目ID(由2个随机名词和一个数字组成)
- 转到解压缩的文件夹 gcd-v1beta2-rev1-2.1.1,您应该会看到一个文件夹 myProjectName。在这个 myProjectName 文件夹中,在文件夹 WEB-INF 中创建一个文件 datastore-indexes.xml
因为我想检索祖先 Company 且年龄超过 20 岁的 Person,所以我必须添加正如埃德戴维森所说的指数
<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes autoGenerate="true">
<datastore-index kind="Person" ancestor="true">
<property name="age" direction="asc" />
</datastore-index>
</datastore-indexes>
在您的控制台中,./gcd.sh updateindexes myProjectName
现在,在 Google Developers Console 中,您可以在 Cloud Datastore -> Index
下看到这个新索引
最后你可以检索 Person where age > 20
Key acmeKey = makeKey("Company", "Acme").build();
Query.Builder query = Query.newBuilder();
query.addKindBuilder().setName("Person");
query.setFilter(makeFilter(
makeFilter("__key__",
HAS_ANCESTOR,
makeValue(acmeKey)).build(),
makeFilter("age",
GREATER_THAN,
makeValue(20)).build()));
query.addOrder(makeOrder("age", ASCENDING));
在 Android Studio 中,我尝试使用 Google Clood Datastore Android应用
使用 Google 示例 https://cloud.google.com/datastore/docs/concepts/indexes#Datastore_Indexes_and_properties 我可以将 Tom(32 岁)和 Lucy(30 岁)添加为公司 Acme 的人员和 children。我可以看到这两个条目位于 Google 开发人员控制台的数据存储中。
如果我按如下方式设置查询过滤器,我可以从 Company Acme 检索 children。
Key acmeKey = makeKey("Company", "Acme").build(); makeFilter("__key__", PropertyFilter.Operator.HAS_ANCESTOR, makeValue(acmeKey)).build()));
- 如果我只想检索年龄等于 32 岁的人,我将添加到上面的过滤器
makeFilter("age", PropertyFilter.Operator.EQUAL, makeValue(32)).build()
然后,我得到了汤姆这个人。
- 如果我只想检索年龄等于 32 岁的人,我将添加到上面的过滤器
- 但是,如果我没有使用
Operator.EQUAL
,而是使用Operator.LESS_THAN
或Operator.GREATER_THAN
之类的不等式过滤器,我会收到错误消息“ 未找到匹配索引".
我认为是索引的问题,但是我真的不明白如何设置索引。我使用 Android Studio,我根本不使用 App Engine。我只想像使用 MySQL 一样使用简单的 WHERE age > 32
.
顺便说一句,我尝试使用 GQL,我遇到了完全相同的问题,使用 EQUAL
,但不使用 GREATER_THAN
(在 https://developers.google.com/apis-explorer 中也是如此)。
那么,有人知道我该如何解决这个问题吗?谢谢!!
Cloud Datastore 的索引配置是使用 gcd.sh 工具处理的。
如果您能够 运行 针对 gcd.sh
提供的本地数据存储进行查询,那将是最简单的。该工具可以准确确定您需要哪些索引,然后您可以使用 updateindexes
命令在您的生产应用程序上配置它们。
如果没有,也可以手动配置索引:
gcd.sh create <project> -d <project>
- 在
<project>/WEB-INF/datastore-indexes.xml
创建一个包含以下内容的文件:
<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes
autoGenerate="true">
<datastore-index kind="Company" ancestor="true">
<property name="age" direction="asc" />
</datastore-index>
</datastore-indexes>
gcd.sh updateindexes <project>
文件的确切内容将取决于您要运行的查询。 This page 提供了有关索引文件格式的更多详细信息。
所以,就像Ed Davisson刚才说的,一切都用gcd搞定了。
我花了很多时间才明白该怎么做,所以我把我的经验放在下面,也许对某人有帮助。我正在与 Ubuntu 合作,我不知道其他 OS.
- 在下载文件夹 中下载gcd-v1beta2-rev1-2.1.1.zip
- 解压缩下载的文件
- 在控制台中,转到解压缩的文件夹
cd Downloads/gcd-v1beta2-rev1-2.1.1
- 然后,
./gcd.sh create -d myDataset myProjectName
其中myDataset是Google Developers Console中的项目ID(由2个随机名词和一个数字组成) - 转到解压缩的文件夹 gcd-v1beta2-rev1-2.1.1,您应该会看到一个文件夹 myProjectName。在这个 myProjectName 文件夹中,在文件夹 WEB-INF 中创建一个文件 datastore-indexes.xml
因为我想检索祖先 Company 且年龄超过 20 岁的 Person,所以我必须添加正如埃德戴维森所说的指数
<?xml version="1.0" encoding="utf-8"?> <datastore-indexes autoGenerate="true"> <datastore-index kind="Person" ancestor="true"> <property name="age" direction="asc" /> </datastore-index> </datastore-indexes>
在您的控制台中,
./gcd.sh updateindexes myProjectName
现在,在 Google Developers Console 中,您可以在 Cloud Datastore -> Index
下看到这个新索引最后你可以检索 Person where age > 20
Key acmeKey = makeKey("Company", "Acme").build();
Query.Builder query = Query.newBuilder();
query.addKindBuilder().setName("Person");
query.setFilter(makeFilter(
makeFilter("__key__",
HAS_ANCESTOR,
makeValue(acmeKey)).build(),
makeFilter("age",
GREATER_THAN,
makeValue(20)).build()));
query.addOrder(makeOrder("age", ASCENDING));