我想按特定顺序按字段排序,比方说2,4,1,5,3。
在MySQL中,我可以使用ORDER BY FIELD(id,2,4,1,5,3)
。
ArangoDB有什么相同的东西吗?
答案 0 :(得分:7)
我认为应该可以使用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 :(得分:1)
不幸的是,目前没有直接的等价物。
但是,有很多方法可以自己完成。
1)通过构建AQL查询: 查询将通过排序值数组运行,并查询每个定义值的数据库。然后将每个结果添加到最终输出数组中。
请注意,这确实会带来性能损失,因为每个值都有一个查询。如果你只定义了几个,我猜它是可以容忍的,但如果你必须定义例如数十或数百,它将导致n + 1个查询(其中n是自定义排序值的数量)。
" + 1"是最后一个查询,它应该获得所有其他值的结果,这些值未在自定义排序数组中定义,并且还将这些值附加到输出数组。
这看起来像下面的代码片段,您可以将其复制到AQL编辑器中并运行它。
摘录说明:
/* 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页面上打开一个功能请求,也许ArangoDB上的好人会考虑包含它。 :)
希望有所帮助