0

我有一个这样定义的对象化实体:

public class MyEntity1
{
    @Id @Indexed String             phoneNumber;
    @Parent @Indexed Key<MyEntity2> parentEntityKey;
}

当我尝试按电话号码过滤时,我收到以下错误消息:

Cannot (yet) filter by @Id fields on entities which have @Parent fields.

这种构造的原因是,当我知道 phoneNumber 和 parentEntityKey 时,我希望能够获取(而不是查询)这些记录,我有时会这样做。在其他一些情况下,我只知道电话号码并希望查询它。

这是 Objectify 或 Datastore 的缺点吗?我可以找到解决方法吗?您是否有一个解决我的两个要求的提案(当我知道两个值时获取而不是查询,当只知道这两个值时通过 phoneNumber 查询)?

4

1 回答 1

2

这是数据存储区密钥的本质。

您不能按键的 id 部分进行过滤。您可以按整个键进行过滤,也可以使用祖先()查询按键层次结构“过滤”,但不能仅按键的 @Id 部分进行过滤。想想 BigTable 中键的布局方式:

/parentkind1/parentid1/parentkind2/parentid2/kind/id

您不能仅对 id 部分进行范围扫描。

听起来您想要做的是在您的实体上创建一个索引 phoneNumber 属性,与 @Id 字段分开。是的,它是重复数据,但无论如何您都需要单独的索引,因此序列化到 blob 中的额外数据可以忽略不计。

请注意,您不能查询事务内的索引属性,并且查询将具有最终的一致性行为。如果您需要唯一分配电话号码,则需要创建一个单独的 PhoneNumber 实体,而没有 @Parent ,其@Id 是电话号码本身。XG 事务允许您创建此唯一性实体并将其与您的 MyEntity1 关联到一个一致的操作中。

于 2012-04-05T16:22:41.760 回答