2016-05-13 36 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