我在Windows 10上使用最新的ArangoDB 3.1。
在这里,我想使用 for 循环删除集合文档和边缘文档。但是我收到一个错误,例如找不到文档(vName(。
vName包含许多集合名称。但我不知道如何在for 循环中使用它。
这是我用来从图表中删除文档的 AQL:
LET op = (FOR v, e IN 1..1 ANY 'User/588751454' GRAPH 'my_graph'
COLLECT vid = v._id, eid = e._id
RETURN { vid, eid }
)
FOR doc IN op
COLLECT vName = SPLIT(doc.vid,'/')[0],
vid = SPLIT(doc.vid,'/')[1],
eName = SPLIT(doc.eid,'/')[0],
eid = SPLIT(doc.eid,'/')[1]
REMOVE { _key: vid } in vName
从 AQL 返回输出 im(Web UI 屏幕截图(
vName
是COLLECT
引入的变量。它是一个带有顶点集合名称的字符串(从 vid/v._id 中提取(。然后,您尝试在删除操作REMOVE { ... } IN vName
中使用它。
AQL 不支持动态集合名称,但是,集合名称必须在查询编译时知道:
每个 REMOVE 操作仅限于单个集合,并且集合名称不得是动态的。
来源: https://docs.arangodb.com/3.2/AQL/Operations/Remove.html
因此,您必须将集合硬编码到查询中,例如REMOVE { ... } IN User
,或者对集合使用特殊的绑定参数语法,例如REMOVE { ... } IN @@coll
和绑定参数:{"@coll": "User", ...}
。
这也意味着REMOVE
只能删除单个集合中的文档。
可以通过使用如下所示的子查询来解决此限制:
LET x1 = (FOR doc IN User REMOVE aa IN User)
LET x2 = (FOR doc IN relations REMOVE bb IN relations)
RETURN 1
变量 x1 和 x2 在语法上是必需的,并接收一个空数组作为子查询结果。查询还需要一个RETURN
语句,即使我们不希望有任何结果。
但是,不要尝试在同一查询中两次从同一集合中删除,因为这会在数据修改错误后引发访问。