【问题标题】:Projection queries with zigzag merge使用 zigzag 合并的投影查询
【发布时间】: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


    【解决方案1】:

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

    在示例中,最后一个排序顺序是在投影属性上完成的。删除此索引后,它会更改排序顺序,并且需要一种新的索引排序才能使其工作。

    所以,我认为目前在 AppEngine 上我所追求的东西是不可能的。需要一个新的专用 AppEngine 功能来启用不影响索引排序顺序的索引属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      相关资源
      最近更新 更多