【问题标题】:How to remove collection or edge document using for loop in ArangoDB?如何在 ArangoDB 中使用 for 循环删除集合或边缘文档?
【发布时间】:2017-07-11 11:01:37
【问题描述】:

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

这里我想使用 for 循环删除集合文档和边缘文档。但我收到类似 document not found (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

Return output im getting from the AQL(网页界面截图)

【问题讨论】:

    标签: collections arangodb aql nosql


    【解决方案1】:

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

    不要尝试在同一个查询中从同一个集合中删除两次,因为这会引发 data-modification 后访问错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 2020-08-01
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多