Google App Engine查询优化

时间:2012-02-24 21:37:54

标签: google-app-engine

我有一个Google App Engine数据存储区,其中可能有数百万条记录,我正在尝试找出最佳的查询方式,我需要获取与多个字符串相匹配的记录。

例如,假设我有以下模型:

字符串名称 字符串级别 Int分数

我需要返回给定“级别”的所有记录,这些记录也匹配“名称”列表。名单中可能只有1个或2个名字,但可能有100个。

它基本上是给定级别(“级别”)的玩家(“名称”)的高分(“得分”)列表。我希望通过“名称”找到一个给定“级别”的玩家列表的所有分数,以建立一个仅包含您的朋友的高分列表。

我可以循环遍历“名字”列表并对每个级别的高分进行查询,但我不知道这是否是最好的方法。在SQL中,我可以构造一个(复杂的)查询来执行此操作。

考虑到数据存储区的大小,我想确保我不浪费时间运行应由查询完成的python代码,反之亦然。

“level”需要是一个String,而不是一个Int,因为它们不是levesl而是级别名称,但我不知道这是否重要。

3 个答案:

答案 0 :(得分:0)

players = Player.all().filter('level =', level).order('score')  

names = [name1, name2, name3, ...]

players = [p for p in players if p.name in names]

for player in players:
    print name, print score

这就是你想要的吗? ......还是我简化了太多?

答案 1 :(得分:0)

不,你不能一次性做到这一点。

您必须逐个查询级别的朋友

为每个级别建立一个朋友评分实体。每次分数变化时,检查他所属的朋友列表并更新他们的所有列表。然后它只是一个问题或检索该列表。

第一个将是缓慢的,第二个是昂贵的,除非优化。

答案 2 :(得分:0)

您可以使用IN filter operator将属性与值列表(用户名)匹配:

scores = Scores.all().filter('level ==', level).filter('user IN', user_list)

请注意,在user_list中,用户执行的查询次数与{{1}}中的用户一样多。