代码之家  ›  专栏  ›  技术社区  ›  Ben

java-GoogleCloudDatastore-返回“未找到匹配索引”的不等式

  •  0
  • Ben  · 技术社区  · 10 年前

    在里面 Android工作室 ,我正在尝试使用 Google Clood数据存储 从Android应用程序。

    以谷歌为例 https://cloud.google.com/datastore/docs/concepts/indexes#Datastore_Indexes_and_properties 我可以将Tom(32岁)和Lucy(30岁)添加为Acme公司的个人和子女。我可以看到这两个条目在Google开发者控制台的数据存储中。

    • 如果我设置如下查询过滤器,我可以从Company Acme检索子项。

      Key acmeKey = makeKey("Company", "Acme").build();
      makeFilter("__key__",
          PropertyFilter.Operator.HAS_ANCESTOR,
          makeValue(acmeKey)).build()));
      
      • 如果我只想检索年龄等于32岁的Person,我会将其添加到上面的筛选器中 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 ).

    那么,有人知道我如何解决这个问题吗?谢谢

    2 回复  |  直到 10 年前
        1
  •  2
  •   Ed Davisson Alfred Fuller    10 年前

    云数据存储的索引配置使用 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 提供了有关索引文件格式的其他详细信息。

        2
  •  0
  •   Ben    10 年前

    所以,正如埃德·戴维森刚才所说,一切都是用gcd完成的。

    我花了很多时间来了解该做什么,所以我把我的经验放在下面,也许这会对某人有所帮助。我正在与 Ubuntu(Ubuntu) ,我不知道其他操作系统。

    1. 下载 gcd-v1beta2-rev1-2.1.1.zip 下载 文件夹
    2. 解压缩下载的文件
    3. 在控制台中,转到解压缩的文件夹 cd Downloads/gcd-v1beta2-rev1-2.1.1
    4. 然后 ./gcd.sh create -d myDataset myProjectName 哪里 myDataset(我的数据集) 是中的项目ID Google Developers Console (由2个随机名词和一个数字组成)
    5. 转到解压缩的文件夹 gcd-v1beta2版本1-2.1.1 你应该会看到一个文件夹 我的项目名称 。在此 我的项目名称 文件夹,在文件夹中 网页-网页 创建文件 数据存储索引.xml
    6. 我想找回 谁有祖先 公司 20多岁时,我不得不按照埃德·戴维森的说法添加索引

      <?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>
    7. 在您的控制台中, ./gcd.sh updateindexes myProjectName

    现在,在Google开发者控制台中,您可以在下面的 云数据存储->指数

    最后你可以找回 年龄>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));