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

How to remove collection or edge document using for loop in ArangoDB?

我在 Windows 10.

上使用最新的 ArangoDB 3.1

这里我想使用for循环移除集合文档和边缘文档。但是我收到类似 document not found (vName).

的错误

vName 包含许多 集合名称 。但是我不知道如何在 for loop.

中使用它

这是我用来从图表中删除文档的 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

Return output im getting from the AQL(Web UI 截图)

vName是由COLLECT引入的变量。它是一个带有顶点集合名称的字符串(从 vid / v._id 中提取)。然后您尝试在删除操作中使用它 REMOVE { ... } IN vName.

AQL 不支持动态集合名称,但是,集合名称必须在查询编译时已知:

Each REMOVE operation is restricted to a single collection, and the collection name must not be dynamic.

来源:https://docs.arangodb.com/3.2/AQL/Operations/Remove.html

因此,您要么必须将集合硬编码到查询中,例如REMOVE { ... } IN User,或者对集合使用特殊的 bind parameter 语法,例如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 语句,即使我们不期望任何结果。

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