查询数据存储中存在的属性值集合

问题描述:

我有一个属性列,它可以在任何时间点都具有以下值的子集:{ a | b | c | d | e }。我的意思是,有时它可以是{ a | d | e }中的任何一个,或者在其他时候甚至可以是{ x | y | z }。我如何查询数据存储库,以便我能够找出该时间点的子集,而不必深入每个实体?查询数据存储中存在的属性值集合

目前我在做这样说:

people = Person.all().fetch(100) 
city = set() 
for p in people: 
    city.add(p.address) 

我想要得到的一组存在在这个时间点(即无重复)的属性值。例如,在某个时间点,所有5,000,000个people都有一个address{ Manila | Cebu | Davao },那么我需要set(Manila, Cebu, Davao)

在另一个时间点,所有500万people将有{ Iloilo | Laoag }address,那么我想set(Iloilo, Laoag)

在查询之前,我不知道set应该由什么组成。

我现在的方法要求我挖掘所有的实体。这是非常低效的,有没有更好的方法?

+0

我不明白你想要做什么。这听起来像你有一个模型,有一个属性可以容纳很多值。这是作为一个列表属性实现的吗?粘贴你的模型。你试图摆脱哪些数据?只有那些在上面的列表属性中有一些确切的值子集的实体?你发布的例子不清楚,也没有帮助。 – mjibson 2012-04-04 03:52:13

+0

@mjibson对不起,我编辑了这个问题,使其更加清晰。 – Kit 2012-04-04 04:28:28

在AppEngine中,在写入期间生成并存储您可能需要的东西几乎总是更好。

因此,在您的使用案例中,每次添加或编辑个人实体时,都会将他们所在的城市添加到列出所有城市的另一个模型中,然后存储该城市实体。

class Cities(db.Model): 
    list_of_cities = db.TextProperty(default="[]") #we'll use a stringified json list of cities 

#when creating a new person/or when editing 
person = Person(city = city) 
cities = Cities.all().get() #there's only one model that we'll use. 
list_of_cities = simplejson.loads(cities.list_of_cities) 
if city not in list_of_cities: 
    list_of_cities.append(city) #add to the list of cities 
    cities.list_of_cities = simplejson.dumps(list_of_cities) 
    db.put(cities) 

person.put() 

你可能想在你的城市实体上使用memcache来加速一些事情。如果您还希望以超过1次写入/秒的速度增加一个以上的人,那么您可能还需要考虑分割城市列表。

+0

谢谢@Albert。那么,元实体就是要走的路。 – Kit 2012-04-04 07:19:06

+0

请注意,这不会从列表中删除不再使用的组件。它也会非常迅速地遇到争议问题。 – 2012-04-05 06:02:14

Albert提出的方法的替代方法是使用mapreduce定期计算这些值。 App Engine Mapreduce库使这非常简单。您的映射器将输出每个记录的城市(例如),而缩减器将输出每个记录的值和次数。