Выполнение большого запроса IN (поиск пользователей со списком идентификаторов) в GAE - PullRequest
1 голос
/ 23 февраля 2011

Я пытаюсь определить, после регистрации пользователя, какие друзья из Facebook уже зарегистрировались для моей службы. Моя текущая реализация сильно загружает процессор:

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 ]

1 голос
/ 24 февраля 2011

Использование оператора IN фактически делает ваш запрос менее эффективным: вместо выполнения быстрой операции get для каждого друга вы выполняете медленную операцию запроса (фильтры IN и! = Разбиваются на несколько запросов на серверной части).

Вместо этого выполните одну пакетную выборку для всех подходящих пользователей:

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

Возвращает список всех друзей с None значениями для всех друзей, которые еще не существуют.

1 голос
/ 23 февраля 2011

Да, вы можете сделать так, чтобы каждый зарегистрированный пользователь сохранял своих друзей в ListProperty, чтобы при регистрации вы могли сделать запрос = в этом свойстве, чтобы узнать, кто у меня в друзьях.= запросов на ListProperties возвращают все сущности, имеющие значение фильтрации в любом месте списка , и они не генерируют подзапросы, как IN запросов.

Простоимейте в виду пределы индекса для каждой сущности , если у некоторых из ваших пользователей есть тонны друзей.

...