使用aql遍历嵌套数组

时间:2019-02-03 23:40:25

标签: arangodb aql

这是我的aql查询,为我提供了到达特定顶点的途径:

FOR v, e, p IN 1..2 OUTBOUND @startVertex GRAPH 'courses'
    FILTER v._id == @target
    RETURN p.vertices

它返回类似这样的内容

[
  [
    {
      "_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[*]时,它总是使数组变平。本质上,我想遍历每个数组并为每个数组返回一些东西。

就像这样的python代码:

lists = [[], [], []]
for l in lists:
    do_something_with_list(l)

1 个答案:

答案 0 :(得分:2)

选项1::您可以将AQL variablessubquery(嵌套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完成),您也可以使用{ {3}}。第一步,您必须注册用户功能,我们将其称为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

注意,上面的用户函数必须接受并数组并返回一个数组。