鉴于我在数据存储区中有以下实体:
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个子查询限制。
答案 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
真正最好的选择是在写入时开始存储冗余数据,这使得常用查询的执行成本更低。