我可以过滤多个集合吗?

时间:2019-02-14 09:45:06

标签: arangodb aql

我想过滤多个集合,只返回那些有这些要求的文档,问题是当一个集合中有多个匹配值时,显示的元素就会重复。

FOR TurmaA IN TurmaA
    FOR TurmaB IN TurmaB

FILTER TurmaA.Disciplinas.Mat >10
FILTER TurmaB.Disciplinas.Mat >10

RETURN {TurmaA,TurmaB}

Screenshot of the problem

1 个答案:

答案 0 :(得分:1)

查询的作用是迭代第一个集合的所有文档,并为每个记录迭代第二个集合。应用的过滤器会减少结果的数量,但是由于效率极低,因此您不应该这样做。

您是否真的要从两个集合中返回匹配项的并集?
(在SQL中为SELECT ... UNION SELECT ...)。 使用当前方法所获得的是来自两个集合的文档的所有可能组合。我相信您想要的是:

LET a = (FOR t IN TurmaA FILTER t.Disciplinas.Mat > 10 RETURN t)
LET b = (FOR t IN TurmaB FILTER t.Disciplinas.Mat > 10 RETURN t)
FOR doc IN UNION(a, b)
  RETURN doc

两个集合都分别在子查询中过滤,然后合并结果并返回。

另一种解决方案是将所有文档存储在一个集合Turma中,并具有另一个属性,例如Type,其值为"A""B"。然后查询将很简单:

FOR t IN Turma
  FILTER t.Disciplinas.Mat > 10
  RETURN t

如果您只想退回 TurmaA 文档,则可以这样做:

FOR t IN Turma
  FILTER t.Disciplinas.Mat > 10 AND t.Type == "A"
  RETURN t

顺便说一句。我建议调用不同于集合名称的变量,例如如果有集合t,则用Turma代替Turma