在AppEngine查询</list>中使用“ANCESTOR IN <list>”

时间:2011-08-18 07:49:47

标签: google-app-engine google-cloud-datastore

我有类型A和B的对象,其中A有很多B(一对多)。

我使用它有两个原因

  1. 能够在实体组内进行交易
  2. 查找作为A对象列表的子对象的所有B对象
  3. 为了适应(1)我需要A成为B的父母。我可以使用这种关系来做(2)查询吗?该查询将是“ANCESTOR IN”过滤器,可能吗?

    否则我会以两种方式存储关系,既作为父母,又作为常规财产?

1 个答案:

答案 0 :(得分:3)

no ANCESTOR IN运算符,只有ANCESTOR IS - 换句话说,您可以轻松找到一个A的子项,但不能很多。以下内容将查找属于特定B的所有A个实体。

parent_key = db.Key.from_path('A', parent_key_name)
children_of_a = B.all().ancestor(parent_key).fetch(100)

了解App Engine中的所有IN查询在幕后使用多个查询非常重要。如果您要添加父属性以进行查询,并且您正在使用高复制数据存储区(您应该这样做),那么您还需要了解cross-entity group queries的细微差别 - 它们不会非常一致。因此,如果您在大多数情况下期望一个非常小的父母列表(例如,一个或两个),并且您想要强一致性,那么您可能更好地运行多个祖先查询。如果您通常拥有许多父母,并且最终的一致性正常,请添加您可以查询的属性。