ArangoDB AQL 查询 - 将子项合并到父项中

ArangoDB AQL Query - merge children into parent

我在ArangoDB 中有一个简单的父子关系。每个父文档可以有零到多个子文档。假设父文档有属性 pa1,子文档有一个属性 ca1,以及对“_id_parent”的父 _id 的引用。如何将 AQL 查询写入 return 结果集,例如:

    [{
            "_key": "111",
            "_id": "parent/111",
            "pa1": "aaa",
            "children": [{
                    "_key": "21",
                    "_id": "child/21",
                    "_id_parent": "parent/111",
                    "ca1": "www"
                },
                {
                    "_key": "22",
                    "_id": "child/22",
                    "_id_parent": "parent/111",
                    "ca1": "xxx"
                }
            ]
        },
        {
            "_key": "222",
            "_id": "parent/222",
            "pa1": "ddd",
            "children": [{
                    "_key": "31",
                    "_id": "child/31",
                    "_id_parent": "parent/222",
                    "ca1": "yyy"
                },
                {
                    "_key": "32",
                    "_id": "child/32",
                    "_id_parent": "parent/222",
                    "ca1": "zzz"
                }
            ]
        }
    ]

换句话说,我如何"flatten"这个:

    FOR p IN Parent
    FILTER p.pa1 == @parm1
    LET children = (
        (FOR c IN Child
            FILTER c._id_parent == p._id
            RETURN c)
    )
    RETURN {p, children}

剩下要做的就是将子文档与父文档实际合并:

RETURN MERGE(p, {children})

这是 RETURN MERGE(p, {children: children}) 的缩写形式。

p是这样的:

{
  "_id": "Parent/111",
  "_key": "111",
  "_rev": "_WLsUlK2--_",
  "pa1": "aaa"
}

{children} 或更详细的 {children: children} 创建一个具有单个属性的对象,名称为 children,值为 children变量:

{
  "children": [
    {
      "_key": "21",
      "_id": "Child/21",
      "_rev": "_WLsW4Su--_",
      "_id_parent": "Parent/111",
      "ca1": "www"
    },
    {
      "_key": "22",
      "_id": "Child/22",
      "_rev": "_WLsW8Zu--_",
      "_id_parent": "Parent/111",
      "ca1": "xxx"
    }
  ]
}

MERGE() 结合了两个对象。由于属性键(“_id”、“_key”、“_rev”、"pa1" 与 "children")没有重叠,因此 p 的顶级属性没有被 [= 替换17=].

顺便说一句:您可以在子查询表达式周围留一对括号
LET var = ( ( <subquery> ) ) - LET var = ( <subquery> ).

就足够了