伟大的爷爷AppEngine祖先查询

时间:2012-06-25 03:32:21

标签: google-app-engine

场景1: 如果我有一个伟大的爷爷祖先(让我们命名为他A);而我的关键是来自“child1”;有没有办法检查我的大爷爷是A? (希望我能做到这一点而不需要循环)

或者我可以检查,如果child1的密钥是路径“A-> B-> C”。
A - > B - > C - > (child1,child2 ......)

场景2: 从上面。伟大的爷爷有另一个来自“G”的后代,想要找回“H”的孩子:

A-> B - > C - > (C的孩子)
...-> G - > H - > (H的孩子)

我喜欢找回“H”的孩子,以为爷爷知道从A,G到H的路径......我可以这样做吗? (希望我能在查询中执行此操作,而不进行循环)

如果你有一个Go1例子:那会很棒......

1 个答案:

答案 0 :(得分:2)

情景1:

如果你想检查Child 1的曾祖父是A,你必须两次调用key.getParent()(检查null父项)。没有API可以为您检查。

如果你想检查实体X是否有A作为祖先,那么你必须调用key.getParent()N次。

但请注意,开销很小。调用key.getParent()不会导致对实际数据存储区的任何调用。

当然,您可以使用祖先查询确保C /实体X是A的后代(如您的方案2所暗示的那样)。从而避免检查查询结果。查询执行的数据存储区将为您检查这一点。

https://developers.google.com/appengine/docs/java/datastore/queries   =>搜索祖先查询 https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/Query#setAncestor(com.google.appengine.api.datastore.Key

childCQuery.setAncestor(entityA.getKey());

情景2:

爷爷'A'无法知道'H'的路径,因为孩子可以在任何时间点添加和删除。对于哪些实体可以是'A'的后代没有限制。因此,只有使用数据存储区查询才能确定“A”的后代。

但如方案1中所述,您可以在查询中指定“A”作为祖先,以便过滤“A”不是祖先的任何结果。

希望这能回答你的问题。

注意:我对您的问题的回答是指java API。我还不熟悉Go API。

感谢。

阿米尔