是否有一种干净的方法可以使用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
指定新值。