2017-10-18 131 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大於給定日期或者不有一個結束日期。最後的過濾器只允許具有與「計數器」變量中相同數量的邊的路徑。