【问题标题】:Query on ReferenceProperty查询 ReferenceProperty
【发布时间】:2013-12-23 21:31:04
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    或者添加一个 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-Engine

    最好的办法是在写入时开始存储冗余数据,这样可以降低执行常用查询的成本。

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 2011-07-24
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 2011-03-06
      • 2012-04-07
      相关资源
      最近更新 更多