Я хочу найти набор пользователей, не имеющих профиля.Arangodb AQL Filter NOT IN collection, очень медленно
ArangoDB 2.4.3
LENGTH(users) -> 130k
LENGTH(profiles) -> 110k
users.userId -> unique hash index
profiles.userId -> unique hash index
Это AQL фрагмент кода я сделал это медленнее, чем улитка пересечения Гранд-Каньон в середине лета.
LET usersWithProfiles = (/* This part is ok */
FOR i IN users
FOR j IN profiles
FILTER i.userId == j.userId
RETURN i
)
LET usersWithoutProfiles = (/* This is not */
FOR i IN usersWithProfiles
FILTER i NOT IN users
RETURN i
)
RETURN LENGTH(usersWithoutProfiles)
Я уверен, что есть совершенно нормальный способ сделать это правильно, но я пропущу его. Есть идеи?
Edit 1 (После того, как @dothebart «s ответ):
Это новый запрос, но он по-прежнему очень медленно
LET userIds_usersWithProfile = (
FOR i IN users
FOR j IN profile
FILTER i.userId == j.userId
RETURN i.userId
)
LET usersWithoutProfiles = (
FOR i IN users
FILTER i.userId NOT IN userIds_usersWithProfile
RETURN i
)
RETURN LENGTH(usersWithoutProfiles)
Фантастический, работал как шарм! Спасибо (и за объяснение)! :) – rollingBalls