【问题标题】:In ArangoDB AQL how do I update fields of every traversed object, regardless of collection?在 ArangoDB AQL 中,我如何更新每个遍历对象的字段,而不考虑集合?
【发布时间】:2016-11-10 20:37:24
【问题描述】:

UPDATE 语句需要一个集合名称。在图中,我想遍历一条边并更新每个访问的顶点。

类似: FOR v IN 1..50 INBOUND 'pmconfig/6376876' pm_content OPTIONS {uniqueVertices: "global"} [update v.contentsChanged=true]

由于顶点可能在不同的集合中找到,我是否必须将对象划分到每个集合列表中?

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

    无法使用动态(运行时)集合名称更新文档。例如,以下 AQL 查询将无法编译:

    FOR v IN 1..50 INBOUND 'pmconfig/6376876' pm_content
      UPDATE v WITH { contentsChanged : true } IN PARSE_IDENTIFIER(v._id).collection
    

    原因是 UPDATE 和其他数据修改语句要求在查询编译时知道它们的集合名称。使用绑定参数当然可以,但不允许使用运行时表达式。

    一种解决方法是多次运行遍历,每次都使用要更新的硬编码集合。这仍然需要提前了解集合名称。如果图表在两者之间发生变化,也可能存在一致性问题:

    FOR v IN 1..50 INBOUND 'pmconfig/6376876' pm_content
      FILTER PARSE_IDENTIFIER(v._id).collection == 'vertexCollection1'
      UPDATE v WITH { contentsChanged : true } IN vertexCollection1
    
    FOR v IN 1..50 INBOUND 'pmconfig/6376876' pm_content
      FILTER PARSE_IDENTIFIER(v._id).collection == 'vertexCollection2'
      UPDATE v WITH { contentsChanged : true } IN vertexCollection2
    
    ...
    

    另一种解决方法是让遍历已经生成每个集合列表,并为每个集合发出后续查询。例如,以下查询应返回每个集合要更新的键:

    FOR v IN 1..50 INBOUND 'pmconfig/6376876' pm_content
      LET parts = PARSE_IDENTIFIER(v._id) 
      COLLECT collection = parts.collection INTO keys = parts. key 
      RETURN { collection, keys }
    

    示例结果:

    [    
      { 
         "collection" : "vertexCollection1", 
         "keys" : [ 
           "abc" 
         ]    
      },    
      { 
        "collection" : "vertexCollection2", 
        "keys" : [ 
          "xyz", 
          "ddd" 
        ]    
      }  
    ]
    

    使用结果结构,可以轻松构建后续更新查询并发送更新。

    【讨论】:

    • 谢谢。我只是想要第二个意见,我需要先做一个每个集合列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多