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

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

是否有一种简洁的方法可以使用AQL交换某个边的_to_from值?根据Arango's documentation on 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)函数来获取Edge上所有属性的名称,而true参数删除了内部属性(如_key_id_to等)。
然后KEEP(edge, [attributes])函数返回一个新的文档,该文档只包含给定数组中指定的属性,由于ATTRIBUTES函数的作用,在本例中,该数组包含除内部字段以外的所有属性。
然后我使用MERGE函数将原始边的_key合并,交换_to_from的值,以及所有非内部属性。
最后,我使用REPLACE,它会删除原来的边缘并添加新的边缘,就像Arango所要求的那样。
就像我说的,这看起来是可行的,但是特别是MERGE,感觉像是错误的方法来做我所做的事情。有没有更简单的方法来设置对象的值?例如,让我只做一个类似于以下的调用:tempEdge._from = edge._to

vxbzzdmp

vxbzzdmp1#

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

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

相关问题