有效计数给定字段具有不同值的文档

问题描述 投票:0回答:1

我正在尝试计算特定Arango集合中处于每种可能状态的文档数。

这应该可以使用桶式排序策略遍历所有文档,一次遍历所有文档,如果您之前没有看到过状态值,则添加一个值为1的计数器到列表。如果您之前已经看到过该状态,则可以增加计数器。到达最后时,您将在数据库中有一个针对每个可能状态的计数器,该计数器指示当前以该状态存储了多少文档。

我似乎无法弄清楚如何在AQL中编写这种类型的逻辑以作为查询提交。当前的策略是这样的:

  1. 遍历所有文档,仅过滤特定状态的文档。
  2. 遍历所有文档,仅过滤不同特定状态的文档。
  3. ...
  4. 所有状态均已过滤。
  5. 每套的返回大小

此方法有效,但我敢肯定它的速度要慢得多。这也意味着,如果我们添加一个新状态,则必须更新查询以循环遍历所有文档,并根据新状态进行过滤。像查询这样的存储桶排序将很快,并且在创建新状态时也无需更新。

如果这些是文档:

  • {{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
)

然后手动构造在每个文档列表上调用LENGTH的返回对象

任何帮助或其他信息将不胜感激

arangodb aql
1个回答
0
投票

如何使用COLLECT功能? (请参阅文档here

FOR doc IN collection
    COLLECT s = doc.state WITH COUNT INTO c
    RETURN { state: s, count: c }

这将返回类似:

[
  { state: 'A', count: 23 },
  { state: 'B', count: 2 },
  { state: 'C', count: 45 }
]

能完成你所追求的吗?

© www.soinside.com 2019 - 2024. All rights reserved.