[英]Multiple sorting in ArangoDB
我的Web应用程序需要在图形中显示文档属性的几个排序列表。 这些是hours
, cycles
和age
。
我有一个AQL查询,可以很好地遍历图形,并在2毫秒内获取我的应用程序所需的所有数据。 我印象深刻! 但是我需要对每个图形进行排序。 该查询当前返回一个json对象数组,其中包含所有三个属性以及它们适用的ID。 太棒了 该查询还可以很容易地对属性之一进行排序。
我的问题是:我需要对所有这三个列表进行排序,并且不希望对数据库进行三次查询,因为数据全部在我遍历返回的同一文档中。
我想返回json对象的三个排序数组:一个包含hours
和id,一个包含cycles
和id,一个包含age
和id。 这样,我的图就可以轻松显示所有三个图,而无需客户端排序。
尽管数据库非常快,但HTTP请求本身却很耗时,这就是为什么我想一次提取所有三个请求的原因,因为数据本身很小。
我当前的查询是一个简单的图遍历:
for v, e, p in outbound startNode graph 'myGraph'
filters & definitions...
sort v.hours desc
return {"hours": v.hours, "cycles": v.cycles, "age": v.age, "id": v.id}
有什么简单的方法可以告诉Arango将此结构还给我?
{
[
{
"id": 47,
"hours": 123
},
{
"id": 23,
"hours": 105
}...
],
[
{
"id": 47,
"cycles": 18
},
{
"id": 23,
"cycles": 5
}...
],
[
{
"id": 47,
"age": 4.2
},
{
"id": 23,
"age": 0.9
}
]
}
尽管遍历速度很快,但如果可能的话,我宁愿不需要三遍遍遍图来进行遍历。
我的解决方案:
let data = (for v, e, p in outbound startNode graph 'myGraph'
filters & definitions...
return {"hours": v.hours, "cycles": v.cycles, "age": v.age, "id": v.id})
let byHours = (for thing in data
sort thing.hours desc
return {"hours": thing.hours, "id": thing.id})
let byCycles = (for thing in data
sort thing.cycles desc
return {"cycles": thing.cycles, "id": thing.id})
let byAge = (for thing in data
sort thing.age desc
return {"age": thing.age, "id": thing.id})
return {"hours": byHours, "cycles": byCycles, "age": byAge}
我不确定这与您的解决方案性能相比如何,但是最明显的解决方案是遍历一次,然后创建三个排序的结果,如下所示:
LET nodes = (
FOR v, e, p IN OUTBOUND startNode GRAPH 'myGraph'
FILTER ...
RETURN v
)
RETURN {
hours: (
FOR n IN nodes
SORT n.hours DESC
RETURN KEEP(n, ['hours', 'id'])
),
cycles: (
FOR n IN nodes
SORT n.cycles DESC
RETURN KEEP(n, ['cycles', 'id'])
),
age: (
FOR n IN nodes
SORT n.age DESC
RETURN KEEP(n, ['age', 'id'])
)
}
这样只会遍历图形一次,但对结果进行三遍排序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.