加入计数 Arango 的最佳方式

Optimal way of join with counting Arango

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

在数据库中,我有 UsersTagsuserTag 集合。 UsersTags 通过存储在 userTag[=28 中的 'edge' 连接=]. 我想列出所有 Tags(包含来自 Tags 集合的数据)和每个标签 - 连接到 Tag 的用户数。

我有什么(有效):

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' 方法吗?

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

或者,您可以使用以下查询。这些查询的性能更高,但只有 returns 个至少有一个已连接用户的标签。

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

如果您只需要从 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)}