GAE:如何查询特定文档中引用的项目?

GAE: how do I query for an item that is referenced in a specific document?

我有 City -> District,我需要在指定的 City 中找到具有指定的 nameDistrict,如果有的话。

代码:

class City(ndb.Model):
    districts = ndb.KeyProperty(kind=District, repeated=True)

class District(ndb.Model):
    name = ndb.StringProperty()

我该怎么做?

我相信你可能会安排你的模式来更有效地完成这项任务——例如,让城市成为该地区的祖先,使用城市名称或其他唯一的城市 ID,后跟地区名称,在地区实体键,或对模式进行反规范化,以便每个地区冗余地记录其城市以提高搜索速度。

但是,我想您可能还有其他并发症阻碍了这些优化。如果您满意,

def fetch_district_in_city(city, district_name):
    query = District.query(ndb.AND(District.name == district_name,
                                   District.key.IN(city.districts)))
    return query.fetch()

可能工作得很好——它 returns 如果该城市中没有该名称的地区,则它是一个空列表,否则它可能只有一个项目(假设城市中的地区名称是唯一的)。

我认为这不太可能完全令人满意的原因(与我上面提到的优化方案相比)是 IN 方法 "explodes" 对很多 OR== 检查,如 https://cloud.google.com/appengine/docs/python/ndb/queries#neq_and_in 中所述,用于有很多地区的城市。因此,您的应用程序的性能可能会受到影响,并且它正在做的工作量 "behind the curtains" 对于通过上述任何优化(尤其是依赖于键,非常快速和轻量级的优化)来说非常轻量级的东西.. .).