ArangoDB:使用嵌套对象集合键进行联接 使用MERGE 使用ZIP

问题描述

需要有关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
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...