如何在ArangoDB集合的文档中查找最常出现的属性值?

时间:2017-07-09 06:29:03

标签: arangodb aql

我在ArangoDB中有一个集合,其中每个文档都包含一些属性,如

{
    "contributor_name": "Rizano",
    "action": "create",
    "id": 3633,
    "type": "newusers",
    "logtitle": "What to do",
    "timestamp": "2006-07-05",
    "contributor_id": 7878
}

该集合包含数百万个文档。现在我想找出文件中最常出现的contributor_name及其数量。

1 个答案:

答案 0 :(得分:1)

您只需按contributor_name进行分组,并使用特殊的COLLECT语法变体WITH COUNT INTO ...来有效计算每个值在数据集中出现的频率:

FOR doc IN coll
  COLLECT name = doc.contributor_name WITH COUNT INTO count
  RETURN { name, count }

结果可能如下所示:

[
  { "name": "Rizano", "count": 5 },
  { "name": "Felipe", "count": 8 },
  ...
]

如果你喜欢这种格式,你可以像这样合并结果:

[
  {
    "Rizano": 5,
    "Felipe": 8
  }
  ...
]

查询:

RETURN MERGE(
  FOR doc IN coll
    COLLECT name = doc.contributor_name WITH COUNT INTO count
    RETURN { [name]: count }
)

您也可以按计数排序,并将结果限制为最常出现的值,例如像这样(只有最高的贡献者):

FOR doc IN coll
  COLLECT name = doc.contributor_name WITH COUNT INTO count
  SORT count DESC
  LIMIT 1
  RETURN { name, count }

还有COLLECT AGGREGATE,但此特定查询的效果应该没有差异:

FOR doc IN coll
  COLLECT name = doc.contributor_name AGGREGATE count = LENGTH(1)
  SORT count DESC
  LIMIT 1
  RETURN { name, count }

传递给LENGTH的值并不重要,我们想要的只是它返回1的长度(因此给定的贡献者将计数器增加1)。