Google app engine 具有锯齿形合并的投影查询

Google app engine 具有锯齿形合并的投影查询,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我想在AppEngine上使用投影查询和锯齿形合并。这似乎要求在锯齿形合并查询使用的每个索引中都包含投影属性。在我的用例中,这将导致实体更新成本过高 下面是一个使用Java低级数据存储API并使用索引(E、p1、p3)和索引(E、p2、p3)的简单示例;这起作用,但在两个索引中复制了实体E的p3属性 // Create a sample entity with three (indexed) properties. DatastoreService datastore = DatastoreSe

我想在AppEngine上使用投影查询和锯齿形合并。这似乎要求在锯齿形合并查询使用的每个索引中都包含投影属性。在我的用例中,这将导致实体更新成本过高

下面是一个使用Java低级数据存储API并使用索引(E、p1、p3)和索引(E、p2、p3)的简单示例;这起作用,但在两个索引中复制了实体E的p3属性

// Create a sample entity with three (indexed) properties.
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Entity e = new Entity("E");
e.setProperty("p1", 1);
e.setProperty("p2", 1);
e.setProperty("p3", 1);
datastore.put(e);

// Query for the above entity with a projection on property p3.
Query q = new Query("E");
Filter filter1 = new FilterPredicate("p1", FilterOperator.EQUAL, 1);
Filter filter2 = new FilterPredicate("p2", FilterOperator.EQUAL, 1);
q.setFilter(CompositeFilterOperator.and(filter1, filter2));
q.addProjection(new PropertyProjection("p3", Integer.class));
PreparedQuery pq = datastore.prepare(q);
pq.asList(FetchOptions.Builder.withDefaults());
我想删除一个复合索引,比如索引(E,p2,p3),只依赖属性p2的默认索引,从而降低更新成本。但这样做会在运行时导致DatastoreNeedIndexException

请注意,如果我保留上述两个索引,但仅向其中一个添加第四个属性,并在投影中包含这第四个属性,则会出现类似的问题。因此,使用默认索引似乎不是问题

所以我的问题是:有没有任何方法可以在不复制索引中所有投影属性的情况下,使用之字形合并进行投影查询?如果不是,我想了解潜在的技术原因是什么


非常感谢任何指针。

好的,现在我明白了为什么需要在所有涉及的索引中复制投影属性:因为索引排序顺序必须在所有相关索引块(本例中为两个)中相同,才能使之字形合并工作

在本例中,对投影属性执行最后一个排序顺序。当删除此索引时,它会更改排序顺序,需要新的索引排序才能正常工作

所以,我认为我现在不可能在AppEngine上找到我想要的。需要一个新的专用AppEngine功能来启用不影响索引排序顺序的索引属性