我在GAE上部署时遇到错误,但我的应用程序在本地服务器上工作正常。
com.google.appengine.api.datastore.DatastoreNeedIndexException: no matching index found.
The suggested index for this query is:
<datastore-index kind="Order" ancestor="false" source="manual">
<property name="employee" direction="asc"/>
<property name="__key__" direction="asc"/>
<property name="route" direction="asc"/>
</datastore-index>
即使我要求的索引在GAE中服务
__key__ ? Serving 6202 1 MByte
__key__ ? , route ? Serving 6202 1 MByte
__key__ ? , route ? , __key__ ? Serving 6202 2 MBytes
customerName ? , __key__ ? Serving 6202 1 MByte
customerName ? , employee ? , oDate ? , __key__ ? Serving 6202 2 MBytes
customerName ? , oDate ? , __key__ ? Serving 6202 1 MByte
employee ? , __key__ ? , route ? Serving 6202 1 MByte
employee ? , __key__ ? Serving 6202 1 MByte
employee ? , oDate ? , __key__ ? Serving 6202 1 MByte
oDate ? , __key__ ? Serving 6202 1 MByte
route ? , __key__ ? Serving 6202 1 MByte
并且还根据错误建议
更新了datastore-indexes.xml的内容<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes autoGenerate="true">
<!-- Used 7 times in query history -->
<datastore-index kind="Order" ancestor="false" source="manual">
<property name="employee" direction="asc"/>
<property name="__key__" direction="asc"/>
<property name="route" direction="asc"/>
</datastore-index>
<!-- Used 16 times in query history -->
<datastore-index kind="LineItem" ancestor="false" source="manual">
<property name="itemName" direction="asc" />
<property name="orderID" direction="asc" />
<property name="quantity" direction="asc" />
</datastore-index>
</datastore-indexes>
这是我试图运行的查询。
Filter employeeFilter = new FilterPredicate("employee",FilterOperator.EQUAL, saleRepID);
Filter startTimeFilter = new FilterPredicate(Entity.KEY_RESERVED_PROPERTY,FilterOperator.GREATER_THAN_OR_EQUAL, startOrderKey);
Filter endTimeFilter = new FilterPredicate(Entity.KEY_RESERVED_PROPERTY,FilterOperator.LESS_THAN_OR_EQUAL, endOrderKey);
logger.warning("Creating a Final filter to find a uniquely visited routes by that employee in that particular time range");
Filter finalFilterForRoutes = CompositeFilterOperator.and(endTimeFilter, CompositeFilterOperator.and(employeeFilter,startTimeFilter));
logger.warning("Finding a uniquely visited routes by that employee on that particular day");
QueryResultList<Entity> allRoutesVisited = datastore.prepare(new Query("Order").addProjection(
new PropertyProjection("route",String.class)).setDistinct(true)
.setFilter(finalFilterForRoutes))
.asQueryResultList(FetchOptions.Builder.withDefaults());
答案 0 :(得分:1)
不幸的是,你遇到了验证码中的错误(已经修复了,应该在1.8.5或1.8.6中)。实际上不支持该查询,因为它要求'__key__'和'route'都是索引排序顺序中的第一个值(这是不可能的)。如果要执行此查询,则必须在内存中收集“route”的不同值。