使用 Objectify 在 App Engine 中按 ref 的属性进行过滤

Filtering by a ref's properties in App Engine using Objectify

假设代码:

@Entity
public class MyEvent {
  @Id Long id;
  @Index String name;
  Ref<Location> myLocation; 
}

@Entity
public class Location {
  @Id Long id;
  @Index String city;
  @Index String country;
}

有没有办法让我进行筛选以查找特定城市内的所有事件?这似乎需要一个不受支持的连接,但我想仔细检查一下,因为我找不到明确的答案。

此外,如果无法进行此类过滤,构建数据的正确方法是什么?我是否需要一个非规范化的 MyEvent 实体,其中包含我可能过滤的所有字段?

正如您在 Objectify documentation 中所读到的,Ref 属性更像是一个 Objectify 糖,而不是数据存储功能。它们作为键属性存储在数据存储中,因此无法查询键可能指向的实体的属性。

如果您想查询一个城市内的事件,您可以将事件的城市存储在事件本身上并对其进行查询,或者查询一个城市内的所有位置,然后查询与这些位置匹配的任何事件(即是,通过查询存储在事件中的位置键)。第三种选择是将城市变成具有 collection-type 事件字段的实际实体。您还可以使用祖先查询 - 有关详细信息,请参阅“Datastore Queries”文档。