有效地计算给定字段具有不同值的文档
Efficiently count Documents with different values for a given field
我正在尝试计算特定 Arango 集合中处于每种可能状态的文档的数量。
这应该可以在 1 遍使用类似桶排序的策略遍历所有文档时实现,如果以前没有看到状态的值,则添加一个计数器值 1 到列表。如果您以前见过该状态,则增加计数器。到达终点后,数据库中的每个可能状态都会有一个计数器,指示当前以该状态存储了多少文档。
我似乎无法弄清楚如何在 AQL 中编写这种类型的逻辑以作为查询提交。目前的策略是这样的:
- 遍历所有文档,仅过滤特定状态的文档。
- 遍历所有文档,仅过滤不同特定状态的文档。
- ...
- 已过滤所有状态。
- Return 每组大小
这行得通,但我确信它比应有的速度慢得多。这也意味着如果我们添加一个新状态,我们必须更新查询以额外循环遍历所有文档,并根据新状态进行过滤。像查询这样的桶排序会很快,并且不需要更新,因为也会创建新状态。
如果这些是文档:
- {A}
- {B}
- {B}
- {C}
- {A}
那么我希望结果是
{ A:2, B:2, C:1 }
其中 A、B 和 C 是特定字段的值。当前的策略过滤器像这样
LET docsA = (
FOR doc in collection
FILTER doc.state == A
RETURN doc
)
然后在每个文档列表上手动构造 return 调用 LENGTH 的对象
任何帮助或额外信息将不胜感激
使用 COLLECT
函数怎么样? (参见文档 here)
FOR doc IN collection
COLLECT s = doc.state WITH COUNT INTO c
RETURN { state: s, count: c }
这会 return 类似于:
[
{ state: 'A', count: 23 },
{ state: 'B', count: 2 },
{ state: 'C', count: 45 }
]
这会实现您所追求的目标吗?
我正在尝试计算特定 Arango 集合中处于每种可能状态的文档的数量。
这应该可以在 1 遍使用类似桶排序的策略遍历所有文档时实现,如果以前没有看到状态的值,则添加一个计数器值 1 到列表。如果您以前见过该状态,则增加计数器。到达终点后,数据库中的每个可能状态都会有一个计数器,指示当前以该状态存储了多少文档。
我似乎无法弄清楚如何在 AQL 中编写这种类型的逻辑以作为查询提交。目前的策略是这样的:
- 遍历所有文档,仅过滤特定状态的文档。
- 遍历所有文档,仅过滤不同特定状态的文档。
- ...
- 已过滤所有状态。
- Return 每组大小
这行得通,但我确信它比应有的速度慢得多。这也意味着如果我们添加一个新状态,我们必须更新查询以额外循环遍历所有文档,并根据新状态进行过滤。像查询这样的桶排序会很快,并且不需要更新,因为也会创建新状态。
如果这些是文档:
- {A}
- {B}
- {B}
- {C}
- {A}
那么我希望结果是 { A:2, B:2, C:1 } 其中 A、B 和 C 是特定字段的值。当前的策略过滤器像这样
LET docsA = (
FOR doc in collection
FILTER doc.state == A
RETURN doc
)
然后在每个文档列表上手动构造 return 调用 LENGTH 的对象
任何帮助或额外信息将不胜感激
使用 COLLECT
函数怎么样? (参见文档 here)
FOR doc IN collection
COLLECT s = doc.state WITH COUNT INTO c
RETURN { state: s, count: c }
这会 return 类似于:
[
{ state: 'A', count: 23 },
{ state: 'B', count: 2 },
{ state: 'C', count: 45 }
]
这会实现您所追求的目标吗?