【发布时间】:2014-10-20 21:52:40
【问题描述】:
我想将 AppEngine 上的投影查询与 zigzag 合并一起使用。这似乎要求将投影属性包含在 zigzag 合并查询使用的每个索引中。在我的用例中,这会导致实体更新成本过高。
为了说明,下面是一个使用 Java 低级 Datastore API 并使用索引 Index(E, p1, p3) 和 Index(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());
我想删除一个复合索引,比如 Index(E, p2, p3),并且只依赖属性 p2 的默认索引,从而降低更新成本。但这样做会在运行时导致 DatastoreNeedIndexException。
请注意,如果我保留上述两个索引但仅向其中一个索引添加第四个属性并将此第四个属性包含在投影中,则会出现类似的问题。因此,使用默认索引似乎不是问题。
所以我的问题是:有没有什么方法可以使用 zigzag 合并进行投影查询,而无需跨索引复制所有投影属性?如果不是,我想了解潜在的技术原因是什么。
非常感谢任何指针。
【问题讨论】:
标签: google-app-engine google-cloud-datastore