问题描述
需要有关arangoDB联接查询的帮助。我有类似以下的文档,其中用户在嵌套对象(groups)
中包含组集合键。查询用户时,我需要加入组集合并更改响应。仅应WITH QUERY
完成。请检查下面的示例以获取更多的说明。
// User Collection
[
{
_key: "312121"
name: "Ash",groups: {
"1": ["323223",...etc],// Group collection _keys;
"2": ["342323",...etc] // Group collection _keys;
}
}
]
// Group Collection
[
{
_key: "323223"
name: "Group 1"
},{
_key: "313131"
name: "Group 2"
}
]
我尝试了以下查询:
LET user = DOCUMENT('users/312121')
LET groups_keys = ATTRIBUTES(user.groups) // ["1","2"]
LET list = (
FOR key IN groups_keys
LET groups = (
FOR group_key IN user.groups[key] // user.groups["1"] and so on..
LET group = DOCUMENT(CONCAT('groups/',group_key))
RETURN { group_id: group._key,name: group.name }
)
RETURN { [key]: groups }
)
RETURN MERGE(user,{ groups: groups })
哪个将groups
返回为Array
,但需要将groups
设为Object
// Current Output:
{
_key: "312121"
name: "Ash",groups: [ // <-- This should be object,not an array
{
"1": [{ _key: "323223",name: "Group 1" }]
},{
"2": [{ _key: "313131",name: "Group 2" }]
}
]
}
但应采用以下格式:
// Expected Output:
{
_key: "312121"
name: "Ash",groups: { // <-- like this
"1": [{ _key: "323223",name: "Group 1" }],"2": [{ _key: "313131",name: "Group 2" }]
}
}
非常感谢您的帮助!
解决方法
使用MERGE
MERGE
[docs]也接受数组参数:
LET list = MERGE(
/* omitted */
RETURN { [key]: groups }
)
使用ZIP
替代解决方案也可以使用ZIP
[docs]:
LET list = (
/* omitted */
RETURN { key,groups } // Notice the format
)
LET obj = ZIP(list[*].key,list[*].groups)
,
尝试这种希望对您有帮助
const newObject = {};
for (const [key, value] of Object.entries(grouped)) {
newObject[value[0].<your choice of key or>] = value
}