2012-04-05 60 views
0

我有一个这样定义的客观化实体:为什么不按部分实体键过滤?

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

当我试图通过phoneNumber的筛选,我收到以下错误信息:

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

这样做的原因建设,我想当我知道phoneNumber和parentEntityKey时,我有时可以得到(而不是查询)这些记录。在其他一些情况下,我只知道phoneNumber并希望查询它。

这是Objectify或Datastore的缺点,我可以找到解决办法吗?你有一个解决我的两个要求的提案(当我知道这两个值时通过phoneNumber查询,而不知道什么时候获得查询)?

回答

2

这是数据存储键的性质。

您无法通过密钥的ID部分进行过滤。您可以按整个键过滤,也可以使用祖先()查询按键层次进行“过滤”,但不能仅通过键的@Id部分进行过滤。想想密钥如何在BigTable的布局:

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

你不能这样做范围扫描上只是ID部分。

这听起来像你想要做的是在你的实体上创建索引phoneNumber属性,独立于@Id字段。是的,它是重复的数据,但不管什么都需要单独的索引,所以将序列化到blob的额外数据可以忽略不计。

请注意,您无法查询事务内部的索引属性,并且查询将具有最终的一致性行为。如果您需要分配唯一的电话号码,则需要创建一个不带@Parent的单独PhoneNumber实体,其@ @d是电话号码本身。 XG交易使您可以创建此唯一性实体,并通过单一的一致操作将其与MyEntity1相关联。