2017-10-18 4 views
2

En supposant que j'ai les collections de documents suivants:Filtrer sur différents types de bord graphique à l'aide ArangoDb AQL

  • étudiants avec des noms et étudiants Id
  • Classes avec le nom et la classe Id
  • Emplacements avec le nom et l'emplacement Id

et les collections de pointe suivantes spécifiant les relations:

  • StudentClass avec _de et références _To ainsi que début et dates de fin
  • ClassLocations avec juste _de et références _To

Quelle est la meilleure façon de retourner un graphique pour un étudiant pour une date donnée indiquant la classes et lieux? J'ai utilisé quelque chose comme le suivant, mais il retourne des bords StudentClass qui ne sont pas dans la plage de dates. De plus, puisque le filtre ne se trouve pas sur le chemin, je crois que tous les bords seront traversés, ce qui signifie que cela peut ne pas bien évoluer.

FOR v, e, p 
IN 1..10 OUTBOUND "Students/1234" 
StudentClass, ClassLocations 
FILTER ((e.endDate > "2017-10-01") AND (e.startDate < "2017-10-01")) 
OR (e.endDate == null) 
RETURN p 

Répondre

1

Merci à mark.arangodb Je suis en mesure de créer une solution de travail:

FOR v, e, p 
IN 1..10 OUTBOUND "Students/1234" 
StudentClass, ClassLocations 
FILTER p.edges[*].startDate ALL <= @date 
LET counter = (FOR e2 IN p.edges 
       FILTER NOT_NULL(e2.endDate, @date) >= @date 
       RETURN e2) 
FILTER COUNT(counter) == COUNT(p.edges) 
RETURN p 

Le premier filtre assure que tous les bords doivent avoir un startDate avant la date donnée (comme une chaîne) dans le paramètre @date bind. Un front sans la propriété startDate passe ce filtre. (ArangoDb doit traiter null comme une valeur inférieure à quoi que ce soit.)

L'instruction LET crée une variable appelée "counter" et l'affecte à un tableau d'arêtes dont la date endDate est supérieure à la date donnée ou qui ne l'est pas. avoir une endDate. Le filtre final n'autorise que les chemins ayant le même nombre d'arêtes que ceux de la variable "compteur".