arangodb - 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
:
解决方案
是的,有一个更简单的解决方案:
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
推荐阅读
- r - 用于将 data.table 转换为命名向量的命名列表的 R 函数
- c# - C# list 在添加或创建副本后是否保存对元素的引用?
- ruby-on-rails-5 - 从 Rails 中的强参数中获取值
- html - 删除 Daypilot Scheduler 中的列(或将开始时间设置为半小时)
- bash - Bash:Getopts 永远不会运行核心循环
- gradle - 在gradle中,我们如何根据文件名替换文件中的标记
- postman - 从 mininet 获取带宽信息的问题
- android - 模拟器安卓
- python-3.x - 如何在 AWS 中使用 lambda 响应?
- c - 使用结构的 C 堆栈实现