ArangoDB-使用AQL将_与edge的值交换

ArangoDB-使用AQL将_与edge的值交换,arangodb,aql,Arangodb,Aql,是否有一种干净的方法可以使用AQL将边的\u交换到和\u交换到值?根据: 要更改边缘端点,您需要删除旧文档/边缘并插入新文档/边缘。其他字段可以在默认集合中更新 所以我能想到的是这样一个查询: FOR edge IN edge_collection FILTER [some criteria] LET tempEdge = KEEP(edge, ATTRIBUTES(edge, true)) LET newEdge = MERGE([{'_key':edge._key},

是否有一种干净的方法可以使用AQL将边的
\u交换到
\u交换到
值?根据:

要更改边缘端点,您需要删除旧文档/边缘并插入新文档/边缘。其他字段可以在默认集合中更新

所以我能想到的是这样一个查询:

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
参数删除了内部属性(如
\u key
\u id
\u To
,等等)。阅读有关
属性的更多信息

然后,
KEEP(edge,[attributes])
函数返回一个新文档,该文档只包含给定数组中指定的属性,在本例中,由于使用了
attributes
函数,该文档除了内部字段外,其他都是属性。阅读更多关于
保持
的信息

然后我使用
MERGE
函数组合原始边缘的
\u键
,将
\u和
\u值与所有非内部属性交换。阅读有关合并的更多信息

最后,我使用
REPLACE
,它删除原始边并添加新边,就像Arango所要求的那样。阅读有关更换的更多信息


正如我所说,这似乎是可行的,但特别是
合并
让人觉得做我所做的事情是错误的。有没有更简单的方法来设置对象的值?例如,可以让我进行类似于以下内容的调用:
tempEdge.\u from=edge.\u to

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

FOR edge IN edge_collection
    FILTER [some criteria]
    UPDATE edge WITH {_from: edge._to, _to: edge._from} IN edge_collection
    RETURN NEW

\u from
\u to
可以更新(与系统属性
\u id
\u key
\u rev
相比),因此不需要替换整个文档。由于
UPDATE
将更改合并到现有文档中,因此只需指定
\u from
\u to

语句
的新值即可更改边端点,您需要删除旧文档/边并插入新文档。
自3.0 IIRC以来已过时。这是过去遗留下来的东西,需要清除。