【发布时间】:2023-04-04 05:56:02
【问题描述】:
是否有一种干净的方法可以使用 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) 函数来获取边缘上所有属性的名称,并且true 参数删除了内部属性(如_key、_id 、_to 等)。阅读更多关于ATTRIBUTEShere的信息。
然后KEEP(edge, [attributes]) 函数返回一个新文档,该文档仅具有给定数组中指定的属性,在这种情况下,由于ATTRIBUTES 函数,它是除内部字段之外的所有内容。阅读更多关于KEEPhere的信息。
然后我使用MERGE 函数从原始边缘组合_key,交换_to 和_from 值,以及所有非内部属性。阅读更多关于MERGEhere的信息。
最后,我使用REPLACE 删除原始边缘并添加新边缘,就像 Arango 需要的那样。阅读更多关于REPLACEhere的信息。
就像我说的,这似乎可行,但 MERGE 尤其让人感觉做我所做的事情的方式是错误的。有没有更简单的方法来设置对象的值?例如,可以让我拨打类似于:tempEdge._from = edge._to?
【问题讨论】:
-
声明
To change edge endpoints you would need to remove old document/edge and insert new one.自 3.0 IIRC 以来已过时。这是过去的遗留物,需要清除。