我试图在用户注册后检测到来自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。
任何提示?
答案 0 :(得分:1)
是的,您可以让每个注册用户将他的朋友存储在ListProperty
中,这样当我注册时,您可以对该属性进行=
查询,以查看谁将我作为朋友。对=
return all entities having the filtered-on value anywhere in the list的ListProperties
次查询,并且它们不会像IN
查询那样生成子查询。
如果您的某些用户拥有大量朋友,请注意per-entity index limits。
答案 1 :(得分:1)
使用IN运算符实际上会降低查询效率:不是对每个朋友进行快速获取操作,而是进行慢速查询操作(IN和!=过滤器分解为后端的多个查询)。
相反,为所有匹配的suers执行单个批量提取:
friendUsers = User.get_by_key_name([x['id'] for x in facebookFriends])
这将返回所有朋友的列表,其中包含任何尚不存在的朋友的None
值。