ArangoDB-使用AQL将_与edge的值交换
是否有一种干净的方法可以使用AQL将边的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},
\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以来已过时。这是过去遗留下来的东西,需要清除。