繁体   English   中英

查询ReferenceProperty

[英]Query on ReferenceProperty

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

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个子查询限制。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM