如何在ArangoDB/AQL中实现类似SQL左连接的可选关联查询
AQL实现类似SQL LEFT JOIN的关联查询
要实现类似SQL LEFT JOIN的效果——即使judgement_of中没有对应边,也保留feed_item的文档并将j设为null——可以用以下两种方法:
方式一:使用LEFT OUTER遍历修饰符
通过LEFT OUTER FOR指定图遍历,当无匹配边时仍保留主集合文档,再通过判断将空值转为null:
FOR d IN feed_item FILTER d.ingested > @when SORT d.score DESC LIMIT 50 LEFT OUTER FOR j IN INBOUND d judgement_of RETURN { d: d, j: j ? j : null }
LEFT OUTER FOR会保留所有符合过滤条件的feed_item数据,若没有对应的judgement_of边,j会被设为null。
方式二:用子查询获取匹配边
通过LET结合子查询获取单条匹配边(存在则取第一条,不存在则返回null):
FOR d IN feed_item FILTER d.ingested > @when SORT d.score DESC LIMIT 50 LET j = FIRST( FOR j_edge IN INBOUND d judgement_of RETURN j_edge ) RETURN { d: d, j: j || null }
FIRST()会返回子查询结果的首个元素,无结果时返回null,最后通过j || null统一空值表现。
注意:两种方式都必须明确关联feed_item文档d与judgement_of边的关系(即INBOUND d judgement_of),否则遍历会变成全量扫描边集合,逻辑不符合需求。
内容的提问来源于stack exchange,提问作者Paul Houle
相关产品推荐
相关产品推荐

