是否有一种简洁的方法可以使用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
?
1条答案
按热度按时间vxbzzdmp1#
是的,有一个更简单的解决方案:
_from
和_to
是可以更新的(与系统属性_id
、_key
和_rev
相反),因此您不需要替换整个文档。并且由于UPDATE
将更改合并到现有文档中,因此您只需要为_from
和_to
指定新值。