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 开发人员控制台的数据存储中。



我认为是索引的问题,但是我真的不明白如何设置索引。我使用 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 命令在您的生产应用程序上配置它们。

如果没有,也可以手动配置索引:

  1. gcd.sh create <project> -d <project>
  2. <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>

  1. gcd.sh updateindexes <project>

文件的确切内容将取决于您要运行的查询。 This page 提供了有关索引文件格式的更多详细信息。

所以,就像Ed Davisson刚才说的,一切都用gcd搞定了。

我花了很多时间才明白该怎么做,所以我把我的经验放在下面,也许对某人有帮助。我正在与 Ubuntu 合作,我不知道其他 OS.

  1. 下载文件夹
  2. 中下载gcd-v1beta2-rev1-2.1.1.zip
  3. 解压缩下载的文件
  4. 在控制台中,转到解压缩的文件夹 cd Downloads/gcd-v1beta2-rev1-2.1.1
  5. 然后,./gcd.sh create -d myDataset myProjectName其中myDatasetGoogle Developers Console中的项目ID(由2个随机名词和一个数字组成)
  6. 转到解压缩的文件夹 gcd-v1beta2-rev1-2.1.1,您应该会看到一个文件夹 myProjectName。在这个 myProjectName 文件夹中,在文件夹 WEB-INF 中创建一个文件 datastore-indexes.xml
  7. 因为我想检索祖先 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>
    

  8. 在您的控制台中,./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));