Dynamic 在marklogic中动态地进行排序

Dynamic 在marklogic中动态地进行排序,dynamic,xquery,marklogic,Dynamic,Xquery,Marklogic,所以,这是我的问题- 我想根据一组决定排序字段和顺序的变量对列表进行排序 本质上,我需要动态地执行“orderby” 例如: 此方法将不起作用,因为它必须多次排序,并且不会在每次迭代中保留排序顺序 我也试过: let $sortFields := fn:tokenize($sort, "\|") let $dec := $direction = 'desc' or $direction = 'descending' let $asc := fn:not($dec) for $i in $resu

所以,这是我的问题-
我想根据一组决定排序字段和顺序的变量对列表进行排序

本质上,我需要动态地执行“orderby”

例如:

此方法将不起作用,因为它必须多次排序,并且不会在每次迭代中保留排序顺序

我也试过:

let $sortFields := fn:tokenize($sort, "\|")
let $dec := $direction = 'desc' or $direction = 'descending'
let $asc := fn:not($dec)
for $i in $results
    for $j in 1 to fn:count($sortFields)

    order by

        if ($sortFields[$j]='id' and $asc) then $i//ldse:document/@id else (),
        if ($sortFields[$j]='id' and $dec) then $i//ldse:document/@id else () descending,

        if ($sortFields[$j]='title' and $asc) then $i//title else (),
        if ($sortFields[$j]='title' and $dec) then $i//title else () descending

return $i
但这重复了我的数据。(返回按每个排序字段排序的结果)

由于代码注入,我不想使用xdmp:eval,有什么方法可以做到这一点吗

任何帮助或建议都将不胜感激


非常感谢 就实现而言,这是一个使用函数项的好例子。。。但要使上升/下降工作需要静态分析。或者,它始终可以是递增(或递减),但值可以是正/负。 e、 g

但在深入研究之前,我建议先看一下search:search()

这其中有一些非常强大的功能,包括能够将复杂的顺序定义为xml元素

最终,为了高效地进行自定义排序,您可能需要创建范围索引,以便可以在服务器本身而不是代码中进行排序。对于小数据集来说,这并不是一个大问题,但当您开始搜索数千、几十万或数百万个文档时,您无法在每次搜索时有效地将它们全部拉入内存(或者即使可以,也会很慢)。不仅所有结果都必须被拉入内存以开始排序,还必须为每个术语评估xquery代码。使用索引,结果集通常可以直接返回到右边,而无需加载文档

您还可以使用其他技术,例如将结果加载到映射或数组中、创建自排序树结构、预创建自定义数据子集等


看看搜索:首先搜索库。。。您甚至可以定义自己的搜索语法供用户输入,所有类型和注入都是安全的,并且经过多年的优化

@StuBob如果此答案帮助您解决问题,请接受答案(勾选绿色复选标记)。还有,欢迎来到SO!
let $sortFields := fn:tokenize($sort, "\|")
let $dec := $direction = 'desc' or $direction = 'descending'
let $asc := fn:not($dec)
for $i in $results
    for $j in 1 to fn:count($sortFields)

    order by

        if ($sortFields[$j]='id' and $asc) then $i//ldse:document/@id else (),
        if ($sortFields[$j]='id' and $dec) then $i//ldse:document/@id else () descending,

        if ($sortFields[$j]='title' and $asc) then $i//title else (),
        if ($sortFields[$j]='title' and $dec) then $i//title else () descending

return $i
for $r in cts:search(...) 
order by myfunc($r, $criteria)
return $r

declare function myfunc( $r , $criteria ) as xs:double
{
  ... logic to order $r in a natural ordering of -inf ... +f..
  return $ordering
};