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