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> )
.
就足够了
我在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> )
.