【问题标题】:Optimal way of join with counting Arango加入计数 Arango 的最佳方式
【发布时间】:2017-07-25 13:58:25
【问题描述】:

我想用 Arango 查询语言编写一个最有效的查询,就像加入计数一样。

在数据库中,我有 UsersTagsuserTag 集合。 UsersTagsuserTag 中存储的“edge”连接。 我想列出所有 标签(包含来自标签集合的数据)和每个标签 - 连接到标签的用户数

我所拥有的(有效):

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”方式?

【问题讨论】:

    标签: count arangodb nosql


    【解决方案1】:

    您的查询已经很好了。一个小的优化:使用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)}
    

    【讨论】:

      【解决方案2】:

      如果您只需要从Tags 到您的Users 的出站计数,并且您的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)}
      

      【讨论】:

        猜你喜欢
        • 2013-06-26
        • 2023-03-24
        • 1970-01-01
        • 2023-03-12
        • 2022-11-18
        • 2015-07-27
        • 1970-01-01
        • 2020-12-05
        • 1970-01-01
        相关资源
        最近更新 更多