我想过滤多个集合,只返回那些有这些要求的文档,问题是当一个集合中有多个匹配值时,显示的元素就会重复。
FOR TurmaA IN TurmaA
FOR TurmaB IN TurmaB
FILTER TurmaA.Disciplinas.Mat >10
FILTER TurmaB.Disciplinas.Mat >10
RETURN {TurmaA,TurmaB}
答案 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
。