加入计数 Arango 的最佳方式
Optimal way of join with counting Arango
我想用 Arango 查询语言编写一个最有效的查询,就像连接和计数一样。
在数据库中,我有 Users、Tags 和 userTag 集合。 Users 和 Tags 通过存储在 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)}
如果您只需要从 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)}
我想用 Arango 查询语言编写一个最有效的查询,就像连接和计数一样。
在数据库中,我有 Users、Tags 和 userTag 集合。 Users 和 Tags 通过存储在 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)}
如果您只需要从 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)}