即使在定义索引之后,也会出现DatastoreNeedIndexException

时间:2013-04-25 17:50:23

标签: google-app-engine google-cloud-datastore

我对GAE java上的DataStore查询存在问题感到困惑 - 它总是抱怨我没有匹配的索引,即使我有他们在我的datastore-indexes.xml中建议的确切索引 - 可以在把我所有的头发拉出来之前,有些东西会流下来吗?

com.google.appengine.api.datastore.DatastoreNeedIndexException: no matching index found.
The suggested index for this query is:
    <datastore-index kind="Users" ancestor="false" source="manual">
        <property name="BILLING_ENABLED" direction="asc"/>
        <property name="EXPIRED" direction="asc"/>
        <property name="api" direction="asc"/>
        <property name="CREATION" direction="asc"/>
    </datastore-index>

我的datastore-indexes.xml

<datastore-indexes autoGenerate="true">
    <datastore-index kind="Users" ancestor="false" source="manual">
    <property name="BILLING_ENABLED" direction="asc"/>
    <property name="EXPIRED_DATE" direction="asc"/>
    <property name="EXPIRED" direction="asc"/>
    <property name="api" direction="asc"/>
    <property name="CREATION" direction="asc"/>
    </datastore-index>
</datastore-indexes>

我的查询:


Query q = new Query("Users");
Filter filter = CompositeFilterOperator.and(new FilterPredicate("api", Query.FilterOperator.EQUAL,
"val"), new FilterPredicate(EXPIRED, Query.FilterOperator.EQUAL, Boolean.FALSE));
filter = CompositeFilterOperator.and(filter, new FilterPredicate("BILLING_ENABLED", Query.FilterOperator.EQUAL, Boolean.FALSE));
filter = CompositeFilterOperator.and(filter, new FilterPredicate("CREATION", Query.FilterOperator.LESS_THAN_OR_EQUAL, cal.getTime()));

如果我理解正确,我需要“api”,“EXPIRED”,“BILLING_ENABLED”和“CREATION”的索引,因为这些索引在查询中使用 - 但是还有什么我需要的吗?

谢谢, 阿德里安

1 个答案:

答案 0 :(得分:2)

建议的查询与您的查询略有不同。它必须完全匹配才能工作。只需添加建议的索引作为额外索引,重新部署您的应用程序,然后从应用程序的仪表板上的数据存储索引部分进行检查,如果它在那里并且状态为:服务