使用 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.verticesp.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 一个数组。