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

ArangoDB - Swap _to and _from values for edge using AQL

是否有一种干净的方法可以使用 AQL 交换边的 _to_from 值?根据 Arango's documentation on Edges:

To change edge endpoints you would need to remove old document/edge and insert new one. Other fields can be updated as in default collection.

所以我想出的是一个如下所示的查询:

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 here.

然后 KEEP(edge, [attributes]) 函数 returns 一个新文档,它只具有给定数组中指定的属性,在这种情况下多亏了 ATTRIBUTES 函数,除了内部领域。阅读更多关于 KEEP here.

然后我使用MERGE函数从原始边缘合并_key,交换_to_from值,以及所有非内部属性。阅读更多关于 MERGE here.

最后,我使用 REPLACE 删除原始边缘并添加新边缘,就像 Arango 要求的那样。阅读更多关于 REPLACE here.

就像我说的,这似乎可行,但 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.

指定新值