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

问题描述

是否有一种干净的方法可以使用 AQL 交换边缘的 _to_from 值?根据{{​​3}}:

要更改边缘端点,您需要删除旧文档/边缘并插入新文档/边缘。其他字段可以像在认集合中一样更新。

所以我想出了一个看起来像这样的查询

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) 函数获取 Edge 上所有属性名称,而 true 参数删除了内部属性(如 {{1 }}、_key_id 等)。阅读有关 _to Arango's documentation on Edges 的更多信息。

然后 ATTRIBUTES 函数返回一个新文档,该文档仅具有给定数组中指定的属性,多亏了本例中的 KEEP(edge,[attributes]) 函数,它是除内部字段之外的所有内容。阅读有关 ATTRIBUTES here 的更多信息。

然后我使用 KEEP 函数组合来自原始边的 MERGE,交换 _key_to 值,以及所有非内部属性。阅读有关 _from here 的更多信息。

最后,我使用 MERGE 删除原始边并添加新边,就像 arango 要求的那样。阅读有关 REPLACE here 的更多信息。

就像我说的,这似乎有效,但特别是 REPLACE 感觉就像我做的事情的错误方式。有没有更简单的方法来设置对象的值?例如,可以让我拨打类似于以下内容的电话:MERGE?

解决方法

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

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 指定新值。