【发布时间】:2017-08-11 12:41:36
【问题描述】:
我希望根据用户输入对结果进行排序。
假设我有可能看起来像这样的sort 对象:
var sort = {createdAt: -1}
或者像这样:
var sort = {createdAt: 1, name: 1}
我的查询看起来像这样:
FOR f in [{createdAt: 123, name: 'BBB'},{createdAt: 2000, name: 'ZZZ'}, {createdAt: 2000, name: 'BBB'}]
SORT f.createdAt DESC
RETURN f
它工作正常。 但我想按用户在排序对象中传递的字段对结果进行排序。 我添加了自定义 arango 函数:
db.createFunction(
'CUSTOM::FILTERING::SORT_STRING',
String(function (sort, it) {
return sort && Object.keys(sort).length !== 0 && sort.constructor === Object ? Object.keys(sort).map(key => `${it}.${key} ${sort[key] >= 0 ? 'ASC' : 'DESC'}`).join(', ') : '';
})
);
但是当我以这种方式使用它时,它根本不起作用。结果未以任何方式排序:
FOR f in [{createdAt: 123, name: 'BBB'},{createdAt: 2000, name: 'ZZZ'}, {createdAt: 2000, name: 'BBB'}]
SORT CUSTOM::FILTERING::SORT_STRING(${sort}, 'f')
RETURN f
如何根据不同的输入参数对结果进行排序?
【问题讨论】:
-
您看过 ArangoDB 中的 Foxx 微服务吗?这是他们的完美应用,让 Foxx 呈现一个 REST API,然后用户可以提供 Sort、PageNum、PageSize、Query 属性,Foxx REST API 会为您完成。
-
@DavidThomas 你能给我一些实现它的例子吗?
-
查看this answer,我在其中提供了一个示例,说明如何设置 Foxx 微服务以响应 REST API 请求。您可以允许调用者通过路径、查询字符串或正文提供额外的查询参数,然后让您的代码调用适当的查询。如何编写 Foxx 微服务超出了这个问题的范围,但它遵循 Node.js 样式格式,网上有很多例子,尤其是在 github.com。
-
@DavidThomas 不幸的是 Foxx 不适合我。有没有办法用自定义函数做到这一点?
-
他们正在远离 UDF,偏爱 Foxx。很抱歉听到 Foxx 不能为您工作,我无法从纯自定义功能的角度回答您的问题。我使用 Foxx 微服务来做到这一点。
标签: javascript node.js arangodb aql