2012-04-04 76 views
0

我有一個屬性列,它可以在任何時間點都具有以下值的子集:{ 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

回答

2

在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

1

Albert提出的方法的替代方法是使用mapreduce定期計算這些值。 App Engine Mapreduce庫使這非常簡單。您的映射器將輸出每個記錄的城市(例如),而縮減器將輸出每個記錄的值和次數。

相關問題