如何在ArangoDB中使用for循环删除集合或边缘文档?



我在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 屏幕截图(

vNameCOLLECT引入的变量。它是一个带有顶点集合名称的字符串(从 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语句,即使我们不希望有任何结果。

但是,不要尝试在同一查询中两次从同一集合中删除,因为这会在数据修改错误后引发访问

最新更新