查询ReferenceProperty

时间:2013-12-23 10:13:13

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

鉴于我在数据存储区中有以下实体:

class Owner(db.Model):
  name = db.StringProperty()
  age = db.IntegerProperty()

class Pet(db.Model):
  name = db.StringProperty()
  owner = db.ReferenceProperty(Owner)

并且有些业主没有宠物,如何最好地提取所有拥有宠物的业​​主,按业主年龄排序?我知道JOINS是不可能的,所以似乎有两个查询。

我试图从Pets中提取所有所有者密钥,然后使用密钥完成了“IN”查询,但我达到了最多30个子查询限制。

1 个答案:

答案 0 :(得分:2)

我会在Owner类中添加一两个属性。

定义添加宠物时设置为True的布尔字段owns_pets(或类似),然后选择按年龄排序owns_pets == True的所有所有者,然后使用每个所有者获取宠物反向集。

另外添加一个ListProperty pets,其中包含所有宠物的所有密钥。然后查询所有所有者(再次使用上面的布尔值更容易)然后查询db.get(some_owner.pets)

如果没有其中任何一种,你就会有一些不太简单的方法。

以年龄顺序循环遍历所有者集,获取反向引用集(在您的情况下为pet_set)跳过所有者,其中pet_set不返回任何内容。

其他方式包括获取所有宠物,收集所有者的密钥(在一个集合中,删除重复项),然后db.get(所有者密钥列表),然后在代码中对它们进行排序 - 如果你没有效率有很多或可能不可行(内存/时间)。)如果你想使用这个路径,看一下nick johnson预取参考集代码http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine

真正最好的选择是在写入时开始存储冗余数据,这使得常用查询的执行成本更低。