我在ArangoDB中有一个集合,其中每个文档都包含一些属性,如
{
"contributor_name": "Rizano",
"action": "create",
"id": 3633,
"type": "newusers",
"logtitle": "What to do",
"timestamp": "2006-07-05",
"contributor_id": 7878
}
该集合包含数百万个文档。现在我想找出文件中最常出现的contributor_name
及其数量。
答案 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)。