2016-05-13 51 views
1

假設我有收集用戶和公司。然後我有名爲works_in的邊緣集合將用戶與公司連接起來。 我使用AQL查詢如下:在arangodb中「unnest」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} 

但問題是,我有很多的屬性顯示,而且用戶可能沒有某些特定屬性(這樣的話顯示爲「空」)

因此,沒有人知道我怎麼能「UNNEST」用戶正常嗎?謝謝

回答

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

驚人!我不知道MERGE,非常感謝你,這正是我正在尋找的! – Dovi