使用gcloud查询Google数据存储区时出现索引错误

时间:2015-10-30 07:48:28

标签: google-cloud-datastore gcloud

我正在尝试将谷歌数据存储用于我的非GAE应用程序。

为此我使用gcloud python库在数据存储区中创建了种类和祖先相关的实体。

还使用gcd工具通过WEB-INF / datastore-indexes.xml文件更新了所有类型的数据存储区索引配置,并且其状态为“正在服务。”

但是我无法在控制台或使用gcloud lib中成功查询基于索引的列。

以下是查询&回溯

from gcloud import datastore

ds = datastore.Client(dataset_id='XXXXXX')
query = datastore.Query(ds, kind='event')
query.add_filter('EvtName', '=', 'buy')
query.add_filter('EventDateTime', '<=', datetime.datetime(2015, 10, 22, 8, 45))
for itm in query.fetch():
    print(dict(itm))


gcloud.exceptions.PreconditionFailed: 412 no matching index found.

这是我的datastore-indexes.xml配置

<?xml version="1.0" encoding="utf-8"?>

<datastore-indexes
  autoGenerate="false">
    <datastore-index kind="event" ancestor="true">
        <property name="EvtName" direction="desc" />
        <property name="EventDateTime" direction="desc" />
    </datastore-index>
  <datastore-index kind="att" ancestor="true">
      <property name="EvtAttName" direction="desc" />
        <property name="EventDateTime" direction="desc" />
    </datastore-index>
  <datastore-index kind="att_val" ancestor="true">
      <property name="AttValue" direction="desc" />
        <property name="EventDateTime" direction="desc" />
    </datastore-index>
  <datastore-index kind="user" ancestor="true">
        <property name="EventDateTime" direction="desc" />
    </datastore-index>
</datastore-indexes>
我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

所有索引都设计用于祖先查询(请注意ancestor=true)。但是,您的实际查询不会在特定的祖先中进行查询。

要回答您的特定查询,您需要索引:

<datastore-index kind="event" ancestor="false">
    <property name="EvtName" direction="desc" />
    <property name="EventDateTime" direction="desc" />
</datastore-index>

或者,如果您确实想要查询具有特定父级的实体,请确保使用Query#hasAncestor(Key parentKey)添加祖先过滤器。