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 的例子:那就太棒了......

4

1 回答 1

2

场景一:

如果要检查 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());

场景二:

爷爷“A”不知道到“H”的路径,因为可以随时添加和删除孩子。对哪些实体可以是“A”的后代没有限制。因此,只有通过数据存储查询才能确定“A”的后代。

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

希望这能回答你的问题。

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

谢谢。

阿米尔

于 2012-06-25T07:02:18.563 回答