[英]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.