在GAE上运行大型IN查询(搜索具有ID列表的用户)

时间:2011-02-23 10:26:13

标签: google-app-engine google-cloud-datastore

我试图在用户注册后检测到来自Facebook的哪些朋友已经注册了我的服务。我目前的实现非常占用CPU:

for eachFriend in facebookFriends:
  friendUser = User.get_by_key_name(eachFriend['id'])
  if friendUser:
    friendUsers.append(friendUser)

我尝试使用IN运算符优化查询:

 users = User.all().filter('id IN', idList).fetch(10) # the idList is the list of IDs for a users facebook friends

此方法失败,因为IN运算符的最大子查询为30。

任何提示?

2 个答案:

答案 0 :(得分:1)

是的,您可以让每个注册用户将他的朋友存储在ListProperty中,这样当我注册时,您可以对该属性进行=查询,以查看谁将我作为朋友。对= return all entities having the filtered-on value anywhere in the listListProperties次查询,并且它们不会像IN查询那样生成子查询。

如果您的某些用户拥有大量朋友,请注意per-entity index limits

答案 1 :(得分:1)

使用IN运算符实际上会降低查询效率:不是对每个朋友进行快速获取操作,而是进行慢速查询操作(IN和!=过滤器分解为后端的多个查询)。

相反,为所有匹配的suers执行单个批量提取:

friendUsers = User.get_by_key_name([x['id'] for x in facebookFriends])

这将返回所有朋友的列表,其中包含任何尚不存在的朋友的None值。