Google app engine 查询当前属性值集的数据存储

Google app engine 查询当前属性值集的数据存储,google-app-engine,properties,google-cloud-datastore,set,Google App Engine,Properties,Google Cloud Datastore,Set,我有一个属性列,它可以在任何时间点具有以下值的子集:{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) 我希望获得此时存在的一

我有一个属性列,它可以在任何时间点具有以下值的子集:
{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)
我希望获得此时存在的一组属性值(即没有重复项)。例如,在某一时间点上,所有5000000名
人都有
地址
{马尼拉|宿务|达沃}
,然后我想要
集合(马尼拉、宿务、达沃)

在另一个时间点,所有5000000名
将拥有
地址
{Iloilo | Laoag}
,然后我想要
集合(Iloilo,Laoag)

在任何查询之前,我都不知道
集合
应该由什么组成


我目前的方法要求我挖掘所有的实体。它的效率非常低,还有更好的方法吗?

在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()

您可能希望在cities实体上使用memcache来加快速度。如果你还希望在超过1次写入/秒的脉冲串中添加一个以上的人,那么你可能还需要考虑在城市中列出列表。

<>在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()

您可能希望在cities实体上使用memcache来加快速度。如果你还希望在超过1个写/秒的脉冲串中添加一个以上的人,那么你可能还需要考虑列出城市列表。

< P>艾伯特建议的方法的另一个选择是使用MapReduce周期性地计算这些值。图书馆使这一点相当简单。您的映射器将为每条记录输出城市(例如),而reducer将输出每个记录的值及其出现的次数。

Albert建议的方法的替代方法是使用mapreduce定期计算这些值。图书馆使这一点相当简单。您的映射器将为每条记录输出城市(例如),而reducer将输出值以及每条记录的出现次数。

我不明白您想做什么。听起来您的模型只有一个属性,可以容纳多个值。这是作为列表属性实现的吗?粘贴你的模型。你想得到什么数据?仅那些在上述列表属性中具有某些精确值子集的实体?您发布的示例不清楚,也没有帮助。@mjibson很抱歉,我编辑了这个问题以使其更清楚。我不明白您想做什么。听起来您的模型只有一个属性,可以容纳多个值。这是作为列表属性实现的吗?粘贴你的模型。你想得到什么数据?仅那些在上述列表属性中具有某些精确值子集的实体?您发布的示例不清楚,也没有帮助。@mjibson很抱歉,我已经编辑了问题以使其更清楚。请注意,这不会从列表中删除不再使用的组件。它也会很快遇到争用问题。请注意,这不会从列表中删除不再使用的组件。它还将非常、非常迅速地遇到争用问题。