ArangoDB-使用AQL交换边缘的_to和_from值



是否有一种干净的方法可以使用AQL将_to_from值交换为边?根据Arango关于Edges:的文档

若要更改边缘端点,您需要删除旧文档/边缘并插入新文档/边缘。其他字段可以更新为默认集合中的字段。

所以我能想到的是一个查询,看起来像这样:

FOR edge IN edge_collection
FILTER [some criteria]
LET tempEdge = KEEP(edge, ATTRIBUTES(edge, true))
LET newEdge = MERGE([{'_key':edge._key}, {'_from':edge._to}, {'_to':edge._from}, tempEdge])
REPLACE newEdge IN edge_collection
RETURN NEW

为了解释一下我自己的解决方案,我使用了ATTRIBUTES(edge, true)函数来获取边缘上所有属性的名称,true参数删除了内部属性(如_key_id_to等(。点击此处了解更多关于ATTRIBUTES的信息。

然后,KEEP(edge, [attributes])函数返回一个新的Document,该Document只具有在给定数组中指定的Attributes,在这种情况下,由于ATTRIBUTES函数,它是除内部字段之外的所有内容。点击此处了解更多关于KEEP的信息。

然后,我使用MERGE函数组合来自原始边缘的_key,交换_to_from的值,以及所有非内部属性。点击此处了解更多关于MERGE的信息。

最后,我使用REPLACE,它删除了原来的边,并在中添加了新的边,就像Arango所要求的那样。点击此处了解更多关于REPLACE的信息。

正如我所说,这似乎有效,但MERGE尤其让人觉得做我所做的事情是错误的。有没有一种更简单的方法来设置对象的值?例如,可以让我打一个类似的电话:tempEdge._from = edge._to

是的,有一个更简单的解决方案:

FOR edge IN edge_collection
FILTER [some criteria]
UPDATE edge WITH {_from: edge._to, _to: edge._from} IN edge_collection
RETURN NEW

_from_to可以更新(与系统属性_id_key_rev相反(,因此不需要替换整个文档。由于UPDATE将更改合并到现有文档中,因此您只需要为_from_to指定新值。

最新更新