ArangoDB - 使用 AQL 交换边缘的 _to 和 _from 值
ArangoDB - Swap _to and _from values for edge using AQL
是否有一种干净的方法可以使用 AQL 交换边的 _to
和 _from
值?根据 Arango's documentation on Edges:
To change edge endpoints you would need to remove old document/edge and insert new one. Other fields can be updated as in default collection.
所以我想出的是一个如下所示的查询:
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
等)。阅读更多关于 ATTRIBUTES
here.
然后 KEEP(edge, [attributes])
函数 returns 一个新文档,它只具有给定数组中指定的属性,在这种情况下多亏了 ATTRIBUTES
函数,除了内部领域。阅读更多关于 KEEP
here.
然后我使用MERGE
函数从原始边缘合并_key
,交换_to
和_from
值,以及所有非内部属性。阅读更多关于 MERGE
here.
最后,我使用 REPLACE
删除原始边缘并添加新边缘,就像 Arango 要求的那样。阅读更多关于 REPLACE
here.
就像我说的,这似乎可行,但 MERGE
尤其让人觉得我的做法是错误的。有没有更简单的方法来设置对象的值?例如,可以让我拨打类似于以下内容的电话:tempEdge._from = edge._to
?
是的,有一个更简单的解决方案:
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
.
指定新值
是否有一种干净的方法可以使用 AQL 交换边的 _to
和 _from
值?根据 Arango's documentation on Edges:
To change edge endpoints you would need to remove old document/edge and insert new one. Other fields can be updated as in default collection.
所以我想出的是一个如下所示的查询:
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
等)。阅读更多关于 ATTRIBUTES
here.
然后 KEEP(edge, [attributes])
函数 returns 一个新文档,它只具有给定数组中指定的属性,在这种情况下多亏了 ATTRIBUTES
函数,除了内部领域。阅读更多关于 KEEP
here.
然后我使用MERGE
函数从原始边缘合并_key
,交换_to
和_from
值,以及所有非内部属性。阅读更多关于 MERGE
here.
最后,我使用 REPLACE
删除原始边缘并添加新边缘,就像 Arango 要求的那样。阅读更多关于 REPLACE
here.
就像我说的,这似乎可行,但 MERGE
尤其让人觉得我的做法是错误的。有没有更简单的方法来设置对象的值?例如,可以让我拨打类似于以下内容的电话:tempEdge._from = edge._to
?
是的,有一个更简单的解决方案:
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
.