2017-10-18 124 views
2

假设我有以下的文档集合:过滤器使用ArangoDb AQL

  • 学生姓名和学号
  • 中的类名称和类ID
  • 位置与名称和位置标识

和下面的边缘集合指定的关系:

  • StudentClass与_from和_TO引用,以及开始和结束日期
  • ClassLocations只有_from和_TO引用

什么是返回一个学生一个图表,显示了在给定日期的最佳方式班级和地点?我一直在使用类似以下内容的东西,但是它返回不在日期范围内的StudentClass边缘。此外,由于过滤器不在路径上,我相信所有的边将被遍历,这意味着这可能不能很好地扩展。

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 

回答

1

感谢mark.arangodb我已经能够创建工作液:

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 

第一个过滤器确保所有的边缘必须具有的startDate之前给出的日期(作为字符串)在@date绑定参数中。没有startDate属性的边通过此过滤器。 (ArangoDb必须将null视为小于任何值的值)

LET语句创建一个名为“counter”的变量,并将其分配给一个边数组,该边的endDate大于给定日期或者不有一个结束日期。最后的过滤器只允许具有与“计数器”变量中相同数量的边的路径。