Query on ReferenceProperty



假设数据存储中有以下实体:

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

而且有些主人没有宠物,如何最好地提取所有有宠物的主人,按主人年龄排序?我知道JOIN是不可能的,所以可能会有两个查询。

我试图从宠物中提取所有主人的钥匙,然后用钥匙进行"IN"查询,但我达到了最大30个子查询的限制。

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

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

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

如果没有这两种方法,你会有几个不那么简单的方法。

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

其他方法包括获取所有宠物,收集主人的钥匙(在一组中,删除重复的钥匙),然后db.get(主人钥匙列表),然后在代码中事后订购——如果你有很多或可能不可行(内存/时间),效率就没那么高了。)如果您想使用此路径,请查看nick-johnson预取参考集代码http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine

实际上,最好的选择是在写入时开始存储冗余数据,这样可以降低经常使用的查询的执行成本。

最新更新