2017-07-25 58 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)}