首页 > 解决方案 > ArangoDB - 使用 AQL 交换边缘的 _to 和 _from 值

问题描述

有没有一种干净的方法来使用 AQL 交换边缘的_to_from值?根据Arango 关于 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等)。阅读更多关于ATTRIBUTES 这里

然后该KEEP(edge, [attributes])函数返回一个新文档,该文档仅具有给定数组中指定的属性,这要归功于ATTRIBUTES本例中的函数,除了内部字段之外的所有内容。阅读更多关于KEEP 这里

然后我使用该MERGE函数组合_key原始边缘的 ,交换_to_from值以及所有非内部属性。阅读更多关于MERGE 这里

最后,我使用REPLACE它删除原始边缘并添加新边缘,就像 Arango 需要的那样。阅读更多关于REPLACE 这里

就像我说的那样,这似乎可行,但MERGE特别是感觉做我所做的事情的方法是错误的。有没有更简单的方法来设置对象的值?例如,可以让我拨打类似于以下内容的电话tempEdge._from = edge._to

标签: arangodbaql

解决方案


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

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_revUPDATE_from_to


推荐阅读