开发者社区 问答 正文

如何使用aql在arangodb中执行完全加入?

我有3个集合,我必须使用aql执行完全连接,如何查询完全连接?

collection 1 :[
                { id :1 , Attr1:"abc" },
                { id :2 , Attr1:"asc" },
                { id :4 , Attr1:"def" },
                { id :5 , Attr1:"xyz" }
              ]

collection 2 :[
                { id :1 , Attr2: true },
                { id :2 , Attr2: false },
                { id :3,  Attr2: true },
                { id :6 , Attr2: true }
              ]

collection 3 :[
                { id :1 , Attr3: "jack" },
                { id :3 , Attr3: "ryan" },
                { id :4 , Attr3: "sam" },
                { id :7 , Attr3: "rick" }
              ]

预期结果是:-

[         
    { id :1 , Attr1:"abc" , Attr2: true , Attr3: "jack" },                    
    { id :2 , Attr1:"asc" , Attr2: false },
    { id :3,  Attr2: true , Attr3: "ryan" },
    { id :4 , Attr1:"def" , Attr3: "sam" },
    { id :5 , Attr1:"xyz" },
    { id :6 , Attr2: true },
    { id :7 , Attr3: "rick" }
]

展开
收起
垚tutu 2019-11-28 19:04:48 733 分享 版权
阿里云 AI 助理回答

在ArangoDB中,要实现这样的完全连接(即笛卡尔积)查询,你可以使用FOR循环结合集合,并利用LET来保存中间结果,最后用UNION操作符将所有结果合并。但是要注意,对于大数据集,这种方法可能会非常低效。以下是一个示例AQL查询:

LET c1 = (
  FOR doc IN collection1
    RETURN { id: doc.id, Attr1: doc.Attr1 }
)

LET c2 = (
  FOR doc IN collection2
    FILTER NOT(doc.id IN [doc.id FOR doc IN c1]) // 避免重复id
    RETURN { id: doc.id, Attr2: doc.Attr2 }
)

LET c3 = (
  FOR doc IN collection3
    FILTER NOT(doc.id IN [doc.id FOR doc IN c1] + [doc.id FOR doc IN c2]) // 避免重复id
    RETURN { id: doc.id, Attr3: doc.Attr3 }
)

RETURN UNION(c1, c2, c3)

这个查询首先分别从每个集合中提取数据并存储到变量c1c2c3中。为了尽量减少重复的id,我们在每个后续的FOR循环中使用了FILTER语句来排除已经在之前集合中出现过的id。最后,使用UNION操作符将这三个集合的结果合并。

然而,上述方法在处理大量数据时可能不是最优解,特别是当需要考虑性能和效率时。如果三个集合之间存在某种关联性,通常建议使用JOIN操作或者图形数据库功能来更高效地进行连接查询。但根据你的需求,看起来你是在寻求一个类似SQL全外连接的结果,而ArangoDB的AQL并不直接支持全外连接操作,因此上述方法是一种变通方式。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: