arangodb - 高效的 ArangoDB AQL 查询,可以找到集合中去往和来自相同文档的所有边
问题描述
我有一个带有两个集合的 ArangoDB,一个用于文档,一个用于边缘,我想要一个高效的查询,它只能返回共享相同_to
和_from
值的边缘。
例如,假设我的 Documents 集合包含 A、B、C 和 D。我们还假设我的 Edges 集合包含 X、Y 和 Z。
边 X 是_from
A 和_to
B。
边 Y 也是_from
A 和_to
B。
边 Z 是_from
C 和_to
D。
但是,我不知道X和Y是基本相同的Edge,也不知道共享相似Edge的Document是A&B。我的查询是找出这些重复的Edge。
我到目前为止看起来像这样:
FOR ec1 IN edge_collection
FOR ec2 IN edge_collection
FILTER ec1._key != ec2._key AND ec1._to == ec2._to AND ec1._from == ec2._from
RETURN ec1
这似乎有效,尽管它也感觉非常低效。有没有更好的方法来做到这一点,或者这是 AQL 的最佳解决方案?
解决方案
经过更多的挖掘,我发现使用COLLECT语句的方法要快得多。
此外,充分披露,这是我建立在这个其他答案的基础上。
LET duplicates = (
FOR ec IN edge_collection
COLLECT from = ec._from, to = ec._to WITH COUNT INTO count
FILTER count > 1
RETURN {
from: from,
to: to,
count: count
}
)
FOR d IN duplicates
FOR ec IN edge_collection
FILTER d.from == ec._from AND d.to == ec._to
RETURN ec
编辑:
基于@CodeManX 的回答,我的最终目标是能够删除或删除这些重复值。如果有人出于类似的目标偶然发现了这一点,这可能会有所帮助:
LET duplicates = (
FOR ec IN edge_collection
COLLECT from = ec._from, to = ec._to AGGREGATE count = LENGTH(1) INTO edges = ec._key
FILTER count > 1
RETURN { from, to, count, edges }
)
FOR d IN duplicates
LET key_to_delete = FIRST(d.edges)
REMOVE { _key: key_to_delete } IN edge_collection
推荐阅读
- c# - how to create C# code for XAML Grid code?
- react-native - 反应本机路由器通量不接收参数
- php - 修改数组多维php
- sql - 需要一个函数来使用 SQL 将十进制值转换为十六进制
- node.js - 使用 ReactJs 前端和 ExpressJs 后端托管 webapp
- c# - 使用 VSTO 的 Microsoft Access 加载项
- html - div内的边界框/框
- apollo - 阿波罗初学者:无法从缓存中读回数据
- laravel - 停止 php artisan serve 的奇怪行为
- java - 从另一个包调用类的方法而不实例化该类