如何最小化XQuery中FOR循环的使用?

时间:2018-07-27 09:36:20

标签: xquery marklogic

我有如下代码,我想知道无需使用 FOR 循环-

就可以得到相同的结果
let $doc :=  cts:search(fn:doc(), 
                cts:element-value-query(......))

let $column-values := ("one,two,three....") (: Can be n number of values :)

let $tokenized-values := fn:tokenize($column-values, ",")

let $result := for $i in $doc
               let $temp := for $j in $tokenized-values
                              return fn:concat("$i//*:",$j)

                    return <root>{xdmp:value($temp)}</root>

return <result>{$result}</result>

预期结果如下-

<result>
  <root>
    <one>abc</one>
    <two>456</two>
    <three>675</three>
  </root>
  <root>
    <one>dfd</one>
    <two>235</two>
    <three>765</three>
  </root>
</result>

我正在获取结果,但是如果我想最大程度地减少使用 FOR 循环,该如何获得相同的结果。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

要提高性能,您可以在要提取的所有列上放置范围索引,并使用cts:element-value-tuples代替cts:search。这样只会拉出您想要的元素,而不是整个文档。

对于第二个for循环的备用语法,您可以使用以下语法:

for $j in $tokenized-values
                          return fn:concat("$i//*:",$j)

收件人

$tokenized-values ! fn:concat("$i//*:", .)

尽管在性能方面大致相同。