我有一个Google App Engine数据存储区,其中可能有数百万条记录,我正在尝试找出最佳的查询方式,我需要获取与多个字符串相匹配的记录。
例如,假设我有以下模型:
字符串名称 字符串级别 Int分数
我需要返回给定“级别”的所有记录,这些记录也匹配“名称”列表。名单中可能只有1个或2个名字,但可能有100个。
它基本上是给定级别(“级别”)的玩家(“名称”)的高分(“得分”)列表。我希望通过“名称”找到一个给定“级别”的玩家列表的所有分数,以建立一个仅包含您的朋友的高分列表。
我可以循环遍历“名字”列表并对每个级别的高分进行查询,但我不知道这是否是最好的方法。在SQL中,我可以构造一个(复杂的)查询来执行此操作。
考虑到数据存储区的大小,我想确保我不浪费时间运行应由查询完成的python代码,反之亦然。
“level”需要是一个String,而不是一个Int,因为它们不是levesl而是级别名称,但我不知道这是否重要。
答案 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}}中的用户一样多。