在 ArangoDB AQL 中,我如何更新每个遍历对象的字段,而不考虑集合?
In ArangoDB AQL how do I update fields of every traversed object, regardless of collection?
UPDATE 语句需要集合名称。在图中,我想遍历一条边并更新访问的每个顶点。
类似于:
FOR v IN 1..50 INBOUND 'pmconfig/6376876' pm_content 选项 {uniqueVertices: "global"} [更新 v.contentsChanged=true]
由于顶点可能存在于不同的集合中,我是否必须将对象划分为每个集合的列表?
无法使用动态(运行 时间)集合名称更新文档。例如,以下 AQL 查询将不会编译:
FOR v IN 1..50 INBOUND 'pmconfig/6376876' pm_content
UPDATE v WITH { contentsChanged : true } IN PARSE_IDENTIFIER(v._id).collection
原因是 UPDATE 和其他数据修改语句要求在查询编译时知道它们的集合名称。使用绑定参数当然可以,但是不允许使用 运行time 表达式。
一种解决方法是运行多次遍历,每次都用一个硬编码的集合来更新。这仍然需要提前了解集合名称。如果图形在两者之间发生变化,也可能存在一致性问题:
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
...
另一种解决方法是让遍历生成每个集合的列表,并为每个集合发出后续查询。例如,以下查询应该 return 每个集合要更新的键:
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"
]
}
]
使用结果结构,可以轻松构建后续更新查询并发送更新。
UPDATE 语句需要集合名称。在图中,我想遍历一条边并更新访问的每个顶点。
类似于: FOR v IN 1..50 INBOUND 'pmconfig/6376876' pm_content 选项 {uniqueVertices: "global"} [更新 v.contentsChanged=true]
由于顶点可能存在于不同的集合中,我是否必须将对象划分为每个集合的列表?
无法使用动态(运行 时间)集合名称更新文档。例如,以下 AQL 查询将不会编译:
FOR v IN 1..50 INBOUND 'pmconfig/6376876' pm_content
UPDATE v WITH { contentsChanged : true } IN PARSE_IDENTIFIER(v._id).collection
原因是 UPDATE 和其他数据修改语句要求在查询编译时知道它们的集合名称。使用绑定参数当然可以,但是不允许使用 运行time 表达式。
一种解决方法是运行多次遍历,每次都用一个硬编码的集合来更新。这仍然需要提前了解集合名称。如果图形在两者之间发生变化,也可能存在一致性问题:
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
...
另一种解决方法是让遍历生成每个集合的列表,并为每个集合发出后续查询。例如,以下查询应该 return 每个集合要更新的键:
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"
]
}
]
使用结果结构,可以轻松构建后续更新查询并发送更新。