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

时间:2017-07-11 11:01:38

标签: collections arangodb aql nosql

我在Windows 10上使用最新的ArangoDB 3.1。

这里我想使用for循环删除集合文档和边缘文档。但是我收到了找不到文档(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(网页屏幕截图)

1 个答案:

答案 0 :(得分:0)

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

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

  

每个REMOVE操作仅限于一个集合,集合名称不能是动态的。

来源: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语句,即使我们不期望任何结果。

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