App Engine中父子实体的分层查询

时间:2014-06-02 07:21:10

标签: google-app-engine gql nosql

是否可以在单个查询传递中查询Parent + Child实体?

这需要在SQL中使用JOIN,但在底层的BigTable中,键是顺序的,因此理论上可以在一次通过中扫描Parent和Child实体。例如:

  • 父-1
  • Parent-1-Child-A
  • Parent-1-Child-B
  • Parent-1-Child-C
  • 父-2
  • Parent-2-Child-D
  • Parent-3
  • 父-3-儿童-E

祖先查询将范围限制为单个父级。我正在寻找的是按键范围查询,不限于单一种类。

1 个答案:

答案 0 :(得分:0)

默认情况下,这样的东西不存在。

我解决这个问题的一种方法是让每个实体将所有可能的路径存储为重复属性,如果您希望以祖先查询的方式在查询中返回它,则包括自身。另外存储直接父母的路径。

ie(我将包含一个超过2个级别的示例)

Parent-1 
paths = ['Parent-1']
parent = []

Parent-1-Child-A
paths = ['Parent-1','Parent-1/Child-A']
parent = ['Parent-1']

Parent-1-Child-C
paths = ['Parent-1','Parent-1/Child-C']
parent = ['Parent-1']

Parent-1-Child-C-Child-F
paths = ['Parent-1','Parent-1/Child-C','Parent-1/Child-C/Child-F' ]
parent = ['Parent-1/Child-C']

Parent-1-Child-C-Child-E
paths = ['Parent-1','Parent-1/Child-C','Parent-1/Child-C/Child-E' ]
parent = ['Parent-1/Child-C']

通过这种方式,您可以查询任何键范围并将深度限制为直接子项。祖先查询无法限制深度。

这需要你使用PolyModel(如果你使用python或java,你还没有说过 - 我不知道java是否有PolyModel模拟)。所以Parent和Child将继承Node,这将基于PolyModel

class Node(ndb.PolyModel):
  pass

class Parent(Node):
  pass

class Child(Node):
  pass

虽然你可能不需要父母和孩子的不同课程。

有一点需要注意,如果您在钥匙中使用祖先/父母,则无法在不完全复制/重写所有孩子的情况下重新安排您的行政人员