我有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" }
]
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在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)
这个查询首先分别从每个集合中提取数据并存储到变量c1
、c2
和c3
中。为了尽量减少重复的id
,我们在每个后续的FOR
循环中使用了FILTER
语句来排除已经在之前集合中出现过的id
。最后,使用UNION
操作符将这三个集合的结果合并。
然而,上述方法在处理大量数据时可能不是最优解,特别是当需要考虑性能和效率时。如果三个集合之间存在某种关联性,通常建议使用JOIN操作或者图形数据库功能来更高效地进行连接查询。但根据你的需求,看起来你是在寻求一个类似SQL全外连接的结果,而ArangoDB的AQL并不直接支持全外连接操作,因此上述方法是一种变通方式。