2016-05-13 7 views
1

Итак, скажем, у меня есть коллекция пользователей и компаний. Затем у меня есть краевая коллекция с именем works_in, которая связывает пользователя с компаниями. Я использую следующие акль запроса:«unsest» Результат запроса aql в arangodb

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} 

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

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

ответ

1

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

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}) 
+0

Удивительный! Я не знал MERGE, большое спасибо, это именно то, что я искал! – Dovi