2015-02-10 34 views
3

我想找到沒有配置文件的用戶組。Arangodb AQL過濾器不在收集,很慢

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) 

我很確定有一個完全正確的做法,但我錯過了它。有任何想法嗎?

編輯1(後@dothebart的迴應):

這是新的查詢,但它仍然是非常緩慢

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) 

回答

5

還要注意,原始查詢的該部分是極其昂貴的:

LET usersWithoutProfiles = (
    FOR i IN usersWithProfiles 
    FILTER i NOT IN users 
    RETURN i 
) 

原因是FILTER使用users,其在這一點上是建立從集合作爲數組的所有文檔的表達式。 而不是使用這個的,我建議這個查詢,這將返回用戶的_key屬性沒有相關的資料記錄:

FOR user IN users 
    LET profile = (
    FOR profile IN profiles 
     FILTER profile.userId == user.userId 
     RETURN 1 
) 
    FILTER LENGTH(profile) == 0 
    RETURN user._key 
+0

神奇,像魅力工作!謝謝(併爲解釋以及)!:) – rollingBalls 2015-02-10 19:05:42

3

之所以表現不佳是它將無法爲您的操作使用索引,因爲它需要對集合中的每個文檔進行完整比較。

您可以使用解釋https://www.arangodb.com/2015/02/02/arangodb-2-4-2實用程序讓arangodb告訴您您的查詢費用在哪裏。

您的查詢可能不會做你期望的。 usersWithoutProfiles將爲空,因爲任何具有配置文件的用戶都將在用戶集合中找到。如果你想擁有其他部分的用戶集合,它可能看起來像這樣:

LET usersWithProfiles = (/* This part is ok */ 
FOR i IN users 
    FOR j IN profiles 
     FILTER i.userId == j.userId 
RETURN i 
) 

/* now we pick the IDs, we could have done that in your first query... */ 
LET userWithProfilesIds = FOR i IN userWithProfiles RETURN i.userId; 

/* now filter the user list by that */ 
LET usersWithoutProfiles = FOR i IN users 
    FILTER i.userId NOT IN userWithProfileIds 
    RETURN i; 

RETURN LENGTH(usersWithoutProfiles) 

應該給你一個正確的結果。

+0

謝謝你,我不能相信我做了合乎邏輯的錯誤在第二部分:o然而,查詢仍然緩慢:( - 我重新啓動數據庫100分鐘cpu後5分鐘。 – rollingBalls 2015-02-10 18:11:20