使用 aql 遍历嵌套数组
Iterate through nested arrays with aql
这是我的 aql 查询,它为我提供了通往特定顶点的路径:
FOR v, e, p IN 1..2 OUTBOUND @startVertex GRAPH 'courses'
FILTER v._id == @target
RETURN p.vertices
它return是这样的
[
[
{
"_key": "ADELPHI+UNIVERSITY==BIO+111",
"_id": "courses/ADELPHI+UNIVERSITY==BIO+111"
},
{
"_key": "BOSTON+UNIVERSITY==CAS+BI+108",
"_id": "courses/BOSTON+UNIVERSITY==CAS+BI+108"
}
],
[
{
"_key": "ADELPHI+UNIVERSITY==BIO+111",
"_id": "courses/ADELPHI+UNIVERSITY==BIO+111"
},
{
"_key": "UNIVERSITY+OF+NEVADA-LAS+VEGAS==BIOL+196",
"_id": "courses/UNIVERSITY+OF+NEVADA-LAS+VEGAS==BIOL+196"
},
{
"_key": "BOSTON+UNIVERSITY==CAS+BI+108",
"_id": "courses/BOSTON+UNIVERSITY==CAS+BI+108"
}
]
]
当我使用 FOR
运算符并尝试遍历 p.vertices
或 p.vertices[*]
时,它总是展平数组。本质上,我想遍历每个数组并 return 每个数组的内容。
就像这样python代码:
lists = [[], [], []]
for l in lists:
do_something_with_list(l)
选项 #1: 您可以使用 AQL variables together with a subquery(嵌套 FOR),就像在下面的更新示例中一样:
FOR v, e, p IN 1..2 OUTBOUND @startVertex GRAPH 'courses'
FILTER v._id == @target
LET updatedVertices = (
FOR v in p.vertices
// here you can change the value of v as you want
// in my sample here I convert a v object to a
// string representing it's _id
RETURN v._id
)
RETURN updatedVertices
选项 #2: 如果您的对象转换逻辑复杂(即,如果您的示例中的 do_something_with_list 不是那么简单并且无法完成纯 AQL),您也可以使用 User Function。第一步你必须注册你的用户函数,我们称之为 DO_SOMETHING_WITH_LIST。然后,当您想要使用它时,您的 AQL 将类似于:
FOR v, e, p IN 1..2 OUTBOUND @startVertex GRAPH 'courses'
FILTER v._id == @target
LET updatedVertices = DO_SOMETHING_WITH_LIST(p.vertices)
RETURN updatedVertices
注意,上面的用户函数必须接受数组,return 一个数组。
这是我的 aql 查询,它为我提供了通往特定顶点的路径:
FOR v, e, p IN 1..2 OUTBOUND @startVertex GRAPH 'courses'
FILTER v._id == @target
RETURN p.vertices
它return是这样的
[
[
{
"_key": "ADELPHI+UNIVERSITY==BIO+111",
"_id": "courses/ADELPHI+UNIVERSITY==BIO+111"
},
{
"_key": "BOSTON+UNIVERSITY==CAS+BI+108",
"_id": "courses/BOSTON+UNIVERSITY==CAS+BI+108"
}
],
[
{
"_key": "ADELPHI+UNIVERSITY==BIO+111",
"_id": "courses/ADELPHI+UNIVERSITY==BIO+111"
},
{
"_key": "UNIVERSITY+OF+NEVADA-LAS+VEGAS==BIOL+196",
"_id": "courses/UNIVERSITY+OF+NEVADA-LAS+VEGAS==BIOL+196"
},
{
"_key": "BOSTON+UNIVERSITY==CAS+BI+108",
"_id": "courses/BOSTON+UNIVERSITY==CAS+BI+108"
}
]
]
当我使用 FOR
运算符并尝试遍历 p.vertices
或 p.vertices[*]
时,它总是展平数组。本质上,我想遍历每个数组并 return 每个数组的内容。
就像这样python代码:
lists = [[], [], []]
for l in lists:
do_something_with_list(l)
选项 #1: 您可以使用 AQL variables together with a subquery(嵌套 FOR),就像在下面的更新示例中一样:
FOR v, e, p IN 1..2 OUTBOUND @startVertex GRAPH 'courses'
FILTER v._id == @target
LET updatedVertices = (
FOR v in p.vertices
// here you can change the value of v as you want
// in my sample here I convert a v object to a
// string representing it's _id
RETURN v._id
)
RETURN updatedVertices
选项 #2: 如果您的对象转换逻辑复杂(即,如果您的示例中的 do_something_with_list 不是那么简单并且无法完成纯 AQL),您也可以使用 User Function。第一步你必须注册你的用户函数,我们称之为 DO_SOMETHING_WITH_LIST。然后,当您想要使用它时,您的 AQL 将类似于:
FOR v, e, p IN 1..2 OUTBOUND @startVertex GRAPH 'courses'
FILTER v._id == @target
LET updatedVertices = DO_SOMETHING_WITH_LIST(p.vertices)
RETURN updatedVertices
注意,上面的用户函数必须接受数组,return 一个数组。