Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine App Engine中父子实体的分层查询_Google App Engine_Gql_Nosql - Fatal编程技术网

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

Google app engine App Engine中父子实体的分层查询,google-app-engine,gql,nosql,Google App Engine,Gql,Nosql,是否可以在单个查询过程中查询父实体+子实体 这需要SQL中的联接,但在底层的BigTable中,键是连续的,因此理论上应该可以在一次过程中扫描父实体和子实体。例如: 亲本-1 父-1-Child-A 父-1-子-B 父-1-子-C 亲本2 父-2-子-D 亲本-3 父-3-子-E 祖先查询将范围限制为单个父级。我要寻找的是按键范围进行的查询,它不限于一种类型。类似的内容在默认情况下不存在 我解决这个问题的一种方法是,让每个实体将其所有可能的路径存储为一个重复属性,如果您希望在查询中以祖先查询

是否可以在单个查询过程中查询父实体+子实体

这需要SQL中的联接,但在底层的BigTable中,键是连续的,因此理论上应该可以在一次过程中扫描父实体和子实体。例如:

  • 亲本-1
  • 父-1-Child-A
  • 父-1-子-B
  • 父-1-子-C
  • 亲本2
  • 父-2-子-D
  • 亲本-3
  • 父-3-子-E

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

类似的内容在默认情况下不存在

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

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

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

这将要求您使用PolyModel(您没有说您使用的是python还是java,我不知道java是否有PolyModel模拟)。所以父节点和子节点将从基于PolyModel的节点继承

class Node(ndb.PolyModel):
  pass

class Parent(Node):
  pass

class Child(Node):
  pass
尽管您可能不需要为父级和子级使用不同的类


需要注意的一点是,如果你在密钥中使用祖先/父母,那么如果不完全复制/重写所有的孩子,你就无法重新安排你的继承人身份

谢谢Tim,这是有道理的,尽管它确实强制使用单一种类(或至少是继承种类)的层次结构,这是我试图避免的。看起来是NDB而不是底层数据存储的限制,实际上是数据存储的限制而不是NDB。所有索引都是特定种类的。datstore支持的唯一一种无类型查询是祖先查询。Tim,我知道索引是特定于类型的,但我的理解是,底层BigTable键空间不是——它是复合的(/a、/a/b、/a/b/c、/b等),因此应该可以进行有效的键范围扫描(不使用任何辅助索引)。从根实体开始,从父实体到子实体,再到给定实体的实体序列构成了该实体的祖先路径。试试看。没有隐藏的语法。请注意GQL和数据存储api的局限性。除了使用kindless祖先查询外,没有跨种类查询的机制。因为BigTable可能是以某种方式构建的,所以数据存储不是BigTable,而是上面的一层。我希望被证明是错的。尝试降低一个级别,使用原始数据存储api。我已经用过一点了,还没有看到任何机制可以做到这一点。
class Node(ndb.PolyModel):
  pass

class Parent(Node):
  pass

class Child(Node):
  pass