簡體   English   中英

ArangoDB自定義排序順序

[英]ArangoDB custom sort order

我想按特定順序按字段排序,比如說2,4,1,5,3。

在MySQL中,我可以使用ORDER BY FIELD(id,2,4,1,5,3)

ArangoDB有什么等效功能嗎?

我認為應該可以使用POSITION AQL函數,該函數可以返回數組中元素的位置

FOR i IN [ 1, 2, 3, 4, 5 ]                  /* what to iterate over */
  SORT POSITION([ 2, 4, 1, 5, 3 ], i, true) /* order to be returned */
  RETURN i

這將返回:

[ 2, 4, 1, 5, 3 ]

更新 :我的原始答案包括CONTAINS AQL函數,但是應該是POSITION

不幸的是,目前尚無直接等效的方法。

但是,有一些方法可以自己完成。

1)通過構造一個AQL查詢:該查詢將遍歷您的排序值數組,並向數據庫查詢每個定義的值。 這些結果中的每一個都將被添加到最終的輸出數組中。

請注意,這確實會降低性能,因為每個值都有一個查詢。 如果您僅定義幾個,我猜它是可以容忍的,但是如果您必須定義例如幾十個或幾百個,它將導致n + 1個查詢(其中n是自定義排序值的數量)。

“ +1”是最后一個查詢,它應獲取自定義排序數組中未定義的所有其他值的結果,並將它們附加到輸出數組中。

看起來像以下代碼片段,您可以將其復制到AQL編輯器中並運行它。

該代碼段的注意事項:

  • 我首先創建一個數組,該數組代表我們要查詢的集合。
  • 然后我設置定義的排序值。
  • 之后,實際的AQL語句完成其工作。
  • 另外,請注意在外部RETURN語句處的FLATTEN函數,這是必需的,因為在第一個循環中,我們將獲得每個定義的排序值的結果數組。 為了將它們作為唯一的結果集(而不是許多封裝的小結果集)進行處理,所有這些都必須放平到同一級別。

 /* Define a dummy collection-array to work with */ LET a = [ { "_id": "a/384072353674", "_key": "384072353674", "_rev": "384073795466", "sort": 2 }, { "_id": "a/384075040650", "_key": "384075040650", "_rev": "384075827082", "sort": 3 }, { "_id": "a/384077137802", "_key": "384077137802", "_rev": "384078579594", "sort": 4 }, { "_id": "a/384067504010", "_key": "384067504010", "_rev": "384069732234", "sort": 1 }, { "_id": "a/384079497098", "_key": "384079497098", "_rev": "384081004426", "sort": 5 } ] /* Define the custom sort values */ LET cSort = [5,3,1] /* Gather the results of each defined sort value query into definedSortResults */ LET definedSortResults = ( FOR u in cSort LET d = ( FOR docs IN `a` FILTER docs.`sort` == u RETURN docs ) RETURN d ) /* Append the the result of the last (all the non-defined sort values) query to the results of the definedSortResults into the output array */ LET output = ( APPEND (definedSortResults, ( FOR docs IN `a` FILTER docs.`sort` NOT IN cSort RETURN docs ) ) ) /* Finally FLATTEN and RETURN the output variable */ RETURN FLATTEN(output) 

2)一種不同的方法是,用JavaScript編寫的函數擴展AQL,該方法實質上將執行與上述相同的步驟。

當然,您也可以在ArangoDB的GitHub Page上打開功能請求,也許ArangoDB的好伙伴會考慮將其包含在內。 :)

希望能有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM