результат unnest aql-запроса в arangodb

Допустим, у меня есть коллекция пользователей и компаний. Затем у меня есть коллекция ребер с именем works_in, которая связывает пользователя с компаниями. Я использую следующий запрос aql:

FOR user IN Users
   LET companies = (FOR company IN (NEIGHBORS(Users, works_in, user._id, 'outbound', [], {includeData:true}))
       RETURN {company_name: company.name, company_id: company._id})
RETURN {user, companies}

и я получаю:

[
  {
    "user": {
      "_id": "Users/45645",
      "_key": "45645",
      "_rev": "45645",
      "name": "user1",
      "city": "london",
      "age": 23
    },
    "companies": [
        {
          company_name: "company1",
          company_id: "Companies/7897"
        },
        {
          company_name: "company2",
          company_id: "Companies/7878"
        }
    ]
  },
  {
    "user": {
      "_id": "Users/465454",
      "_key": "465454",
      "_rev": "465454",
      "name": "user2",
      "city": "Paris",
      "age": 42
    },
    "companies": [
        {
          company_name: "company1",
          company_id: "Companies/7897"
        },
        {
          company_name: "company3",
          company_id: "Companies/788233"
        }
    ]
  }
]

Однако я хотел бы, чтобы информация о «пользователях» не была вложена в «пользователя», а была следующая:

[
  {
    "_id": "Users/45645",
    "_key": "45645",
    "_rev": "45645",
    "name": "user1",
    "city": "london",
    "age": 23,
    "companies": [
        {
          company_name: "company1",
          company_id: "Companies/7897"
        },
        {
          company_name: "company2",
          company_id: "Companies/7878"
        }
    ]
  },
  {
    "_id": "Users/465454",
    "_key": "465454",
    "_rev": "465454",
    "name": "user2",
    "city": "Paris",
    "age": 42,
    "companies": [
        {
          company_name: "company1",
          company_id: "Companies/7897"
        },
        {
          company_name: "company3",
          company_id: "Companies/788233"
        }
    ]
  }
]

Я знаю, что могу сделать это с помощью атрибутов жесткого кодирования, таких как

RETURN {_id: user.id, _key:user._key, companies}

Но проблема в том, что у меня есть много атрибутов, которые нужно показать, и, кроме того, у пользователей может не быть какого-то определенного атрибута (поэтому тогда отображается как "null")

Итак, кто-нибудь знает, как я могу правильно "разложить" пользователей? Спасибо


person Dovi    schedule 13.05.2016    source источник


Ответы (1)


Для этого вы можете использовать MERGE. Позвольте мне продемонстрировать это с помощью оператора return:

db._query(`RETURN MERGE({
      "_id": "Users/465454", "_key": "465454",
      "_rev": "465454",      "name": "user2",
      "city": "Paris",       "age": 42
    }, {"companies": [
        {
          company_name: "company1",
          company_id: "Companies/7897"
        },
        {
          company_name: "company3",
          company_id: "Companies/788233"
        }
    ]})`
).toArray() =>
[ 
  { 
    "_id" : "Users/465454", 
    "_key" : "465454", 
    "_rev" : "465454", 
    "age" : 42, 
    "city" : "Paris", 
    "companies" : [ 
      { 
        "company_id" : "Companies/7897", 
        "company_name" : "company1" 
      }, 
      { 
        "company_id" : "Companies/788233", 
        "company_name" : "company3" 
      } 
    ], 
    "name" : "user2" 
  } 
]

Поскольку компании предоставляют вам список, вам нужно обернуть его в объект, чтобы MERGE мог выполнять свою работу:

FOR user IN Users
  LET companiesList = (FOR company IN
                           (NEIGHBORS(Users, works_in, user._id, 'outbound', [],
                                     {includeData:true}))
  RETURN MERGE(user, {companies: companiesList})
person dothebart    schedule 17.05.2016
comment
Удивительный! Я не знал MERGE, спасибо большое, это именно то, что я искал! - person Dovi; 17.05.2016