2015-12-09 38 views
1

我使用物化和谷歌云数据存储。Objectify - 一个给定的父母的所有孩子

我正在寻找一种让所有孩子(没有特定类型或种类)父母的方法。

我知道祖先的功能。

我用这个

ofy().load().ancestor(entity).list(); 

这让所有的孩子和孙子(我不希望它)。

在本例,A是1,2和3 1的父

 
    A 
/| \ 
1 2 3 
|  
m  

我想要的数据m的父{2 1,...,3}不{1,2 ,3,m}

你知道一种更准确的结果吗? (没有孙子)

回答

2

有没有优雅的解决方案,我怀疑你在滥用@Parent。应该是非常,很少想要在数据存储中创建grand @ Parent关系。数据存储中的大多数分层关系最好用传统的外键关系来表示。

但是,如果你确定,一种解决方案是使1,2和3所有同一种类型的多态对象。所以,你可以查询这样的:

ofy().load().type(BaseType.class).ancestor(parent) 

有类型的查询的另一个优点是,你现在可以使用过滤器(无类型查询不能有过滤器):

ofy().load().type(BaseType.class).ancestor(parent).filter("arbitraryField", value) 

另一种选择如果您希望排除的值很少,则只需将其取出并将其过滤掉即可。

0

我认为唯一的方法是创建一个指数和parent属性使用过滤。 @parent将父键添加为子键的一部分,所以本质上你将得到所有的下降,除了要过滤的类型之外没有简单的方法。

+0

好的。在这种情况下,我不知道父字段的名称。我如何应用过滤器? 我的意思是所有的孩子都有一个父母的财产,但他们没有相同的名字。 同样的例子。如果在实体1中,父项称为“父项”,但在实体2中称为“parentA” – Michael

+0

您是对的,所以我没有简单的解决方案。对我而言,唯一的方法是由祖先进行查询并通过反射来检查属性是否等于父对象以删除孙辈 –

+0

您不能在@ @ Index''@ Parent'字段中。 “@ Parent”字段不是真正的属性,它们是关键的一部分。 – stickfigure

相关问题