gpt4 book ai didi

javascript - ArangoDB - 使用自定义函数对 aql 中的结果进行排序

转载 作者:搜寻专家 更新时间:2023-10-31 23:58:40 25 4
gpt4 key购买 nike

我想根据用户输入对结果进行排序。

假设我有一个 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

如何根据不同的输入参数对结果进行排序?

最佳答案

纯 AQL,你可以这样做,但在世界的某个地方,一只小狗会死掉......

RETURN (@sortBy == 'createdAt' ?
(FOR d IN @@collectionName
SORT createdAt DESC
RETURN d) : (@sortBy == 'name' ?
(FOR d in @@collectionname
SORT name DESC
RETURN d)
)
)
)

但另一种方法是动态生成 AQL,通过适当的代码检查,您可以安全地进行生成。

我有时动态生成 AQL,但所有参数都经过仔细扫描、清理、Joi 模式验证和验证以阻止 SQL 注入(inject)。

执行此样式查询的另一种方法是:

LET sortByCreatedAt = (
FOR d in @@collectionName
SORT createdAt DESC
RETURN d)

LET sortByName = (
FOR d in @@collectionName
SORT name DESC
RETURN d)

RETURN (@sortBy == 'createdAt') ? sortByCreatedAt : sortByName

这不是很漂亮,但很有效,并且您可以发挥创造力,使用 ASC 和 DESC 作为选项以及预定义数量的列名来编写大量嵌套和复杂的查询。重要的是,列名称不能完全动态,但可以由用户选择。

我还没有在 ArangoDB 服务器上测试过这些,所以可能存在一些拼写错误。

关于javascript - ArangoDB - 使用自定义函数对 aql 中的结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45635506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com