ArangoDB 高效地计算给定字段具有不同值的文档

cnwbcb6i  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(89)

我试图计算特定Arango集合中处于每种可能状态的文档数。
这应该是可能的,在一遍所有文档中使用类似于桶排序的策略,在所有文档中迭代,如果状态的值以前没有看到过,则将值为1的计数器添加到列表中。如果以前看到过该状态,则递增计数器。一旦到达末尾,DB中的每个可能状态都有一个计数器来指示当前存储的具有该状态的文档的数量。
我似乎不知道如何在AQL中编写这种类型的逻辑以作为查询提交。
1.循环遍历所有文档,仅过滤特定状态的文档。
1.在所有文档上循环,仅过滤 * 不同 * 特定状态的文档。
1.一个人。
1.已筛选所有状态。
1.返回每个集合的大小
这是可行的,但我确信它比它应该的要慢得多。这也意味着如果我们添加了一个新的状态,我们必须更新查询以在所有文档上循环一次,基于新的状态进行过滤。类似于桶排序的查询将是快速的,并且在创建新状态时也不需要更新。
如果这些是文件:

  • {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的返回对象
任何帮助或额外的信息将不胜感激

u4vypkhs

u4vypkhs1#

使用COLLECT函数怎么样?(参见此处的文档)

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 }
]

这样能达到你的目的吗

相关问题