单场不平等在开发中有效,在生产中失败
Single field inequality works in dev and fails in production
以下查询在本地计算机上的 Dev 数据存储中有效,但在生产环境中失败。
List<ChildDTO> res = OfyService.ofy()
.load()
.type(classOfChild)
.ancestor(parentKey)
.filter("date >=", fromDateOnly)
.filter("date <=", toDateOnly)
.list();
据我所知,支持具有多个不等式的单个字段。
索引上是否有一些配置可以指示它应该包括祖先?
根据异常描述,需要进行如下索引配置。是否可以使用 Objectify 注释而不是 xml 配置来实现此目的?
<datastore-index kind="ChildDTO" ancestor="true" source="manual">
<property name="date" direction="asc"/>
</datastore-index>
在这种情况下可能会产生误导的是,查询 看起来 是单个 属性 查询,它会使用一个简单的 single-property索引,可使用对象化注释实现。
但事实并非如此:这是一个祖先查询,祖先的存在算作第二个属性,这就是为什么需要复合索引的原因。并且 AFAIK 复合索引无法通过 objectify 注释处理。
这在本地开发环境中工作的原因是开发人员服务器会自动更新索引文件,其中包含缺少的复合索引。但这需要为 GAE 上的应用 运行 明确完成。
以下查询在本地计算机上的 Dev 数据存储中有效,但在生产环境中失败。
List<ChildDTO> res = OfyService.ofy()
.load()
.type(classOfChild)
.ancestor(parentKey)
.filter("date >=", fromDateOnly)
.filter("date <=", toDateOnly)
.list();
据我所知,支持具有多个不等式的单个字段。
索引上是否有一些配置可以指示它应该包括祖先?
根据异常描述,需要进行如下索引配置。是否可以使用 Objectify 注释而不是 xml 配置来实现此目的?
<datastore-index kind="ChildDTO" ancestor="true" source="manual">
<property name="date" direction="asc"/>
</datastore-index>
在这种情况下可能会产生误导的是,查询 看起来 是单个 属性 查询,它会使用一个简单的 single-property索引,可使用对象化注释实现。
但事实并非如此:这是一个祖先查询,祖先的存在算作第二个属性,这就是为什么需要复合索引的原因。并且 AFAIK 复合索引无法通过 objectify 注释处理。
这在本地开发环境中工作的原因是开发人员服务器会自动更新索引文件,其中包含缺少的复合索引。但这需要为 GAE 上的应用 运行 明确完成。