2017-07-25 25 views
2

我想寫一個最有效的查詢在Arango查詢語言工作像加入計數。加入計數的最佳方式Arango

在數據庫中,我有用戶標籤userTag集合。 用戶標籤通過'邊緣'連接,存儲在userTag。 我想列出所有標籤(帶有來自標籤集合的數據)和每個標籤 - 連接到標籤的用戶數量。

我有什麼(它的工作原理):

FOR tag in tags 
    let forOneTag = (
     FOR v, e, p IN 1 OUTBOUND tag 
     ANY userTag 
     RETURN {e} 
    ) 
    RETURN {tag: tag.tagname, numberOfUsers: LENGTH(forOneTag)} 

我不覺得它是關於時間和記憶的最有效方式。 有沒有更多'arangoic'的做法呢?

回答

3

您的查詢已經很好。一個小的優化:使用RETURN e而不是RETURN {e},您不必在文檔中包裝e,因爲它已經是一個文檔。

FOR tag in tags 
    let forOneTag = (
    FOR v, e, p IN 1 OUTBOUND tag 
     ANY userTag 
     RETURN e 
    ) 
    RETURN {tag: tag.tagname, numberOfUsers: LENGTH(forOneTag)} 

或者,您可以使用以下查詢。這些查詢的性能更高,但只返回至少有一個連接用戶的標籤。

FOR tag in tags 
    FOR v, e, p IN 1 OUTBOUND tag 
    ANY userTag 
    RETURN {tag: tag.tagname, numberOfUsers:LENGTH(p.edges)} 
1

如果您只需要outbounds的數量從TagsUsers,讓你的userTags關係集合中關係相當數量有限,你可以做這樣的事情

FOR tag in Tags 
    let usersOutBound = (
    FOR relation in userTag 
     FILTER relation._from == tag._id 
     return relation 
) 
    return {tag: tag.tagname, numberOfUsers: LENGTH(usersOutBound)}