我在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
答案 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
语句,即使我们不期望任何结果。
不要尝试在同一个查询中从同一个集合中删除两次,因为它会在数据修改错误后引发访问。