ArangoDB AQL Query - объединить дочерние элементы в родительские

У меня простые родительско-дочерние отношения в ArangoDB. Каждый родительский документ может иметь от нуля до многих дочерних элементов. Допустим, у родительского документа есть атрибуты pa1, а у дочерних документов есть один атрибут ca1 и обратная ссылка на родительский _id "_id_parent". Как мне написать запрос AQL, чтобы вернуть набор результатов, например:

    [{
            "_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"
                }
            ]
        }
    ]

Другими словами, как мне "сгладить" это:

    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}

person James Haskell    schedule 09.01.2018    source источник


Ответы (1)


Все, что осталось сделать, это фактически объединить дочерние элементы с родительским документом:

RETURN MERGE(p, {children})

Это краткая форма RETURN MERGE(p, {children: children}).

p это:

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

{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 не заменяются на children.

Кстати: вы можете оставить одну пару скобок вокруг выражения подзапроса
LET var = ( ( <subquery> ) ) - этого достаточно, чтобы сделать LET var = ( <subquery> ).

person CodeManX    schedule 09.01.2018
comment
Ах, это волшебство! Я все пытался сделать RETURN MERGE (p, children). Спасибо!! - person James Haskell; 09.01.2018