P3TAR
P3TAR

Reputation: 5

Can I filter multiple collections?

I want to filter multiple collections, to return only documents who have those requirements, the problem is when there is more than one matching value in one collection, the elements shown are repeated.

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

Upvotes: 0

Views: 469

Answers (1)

CodeManX
CodeManX

Reputation: 11855

What your query does is to iterate over all documents of the first collection, and for each record it iterates over the second collection. The applied filters reduce the number of results, but this is not how you should go about it as it is highly inefficient.

Do you actually want to return the union of the matches from both collections?
(SELECT ... UNION SELECT ... in SQL). What you get with your current approach are all possible combinations of the documents from both collections. I believe what you want is:

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

Both collections are filtered individually in sub-queries, then the results are combined and returned.

Another solution would be to store all documents in one collection Turma and have another attribute e.g. Type with a value of "A" or "B". Then the query would be as simple as:

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

If you want to return TurmaA documents only, you would do:

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

BTW. I recommend to call variables different from collection names, e.g. t instead of Turma if there is a collection Turma.

Upvotes: 1

Related Questions