如何最大限度地减少XQuery中FOR循环的使用?

如何最大限度地减少XQuery中FOR循环的使用?,xquery,marklogic,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,

我有一个如下的代码,我想知道不使用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>
let$doc:=cts:search(fn:doc(),
cts:元素值查询(……)
let$列值:=(“一、二、三…”)(:可以是n个值:)
让$tokenized值:=fn:tokenize($column values,,“”)
设$result:=对于$doc中的$i
设$temp:=以$tokenized值表示的$j
返回fn:concat($i/*:“,$j)
返回{xdmp:value($temp)}
返回{$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>

abc
456
675
dfd
235
765
我得到了结果,但是如果我想尽量减少对循环使用,如何才能得到相同的结果


有什么建议吗?

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

对于second For循环的备用语法,可以使用以下语法:

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


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

为了提高性能,您可以在所有要提取的列上放置范围索引,并使用cts:element值元组代替cts:search。这将只提取您想要的元素,而不是整个文档

对于second For循环的备用语法,可以使用以下语法:

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


虽然在性能方面大致相同。

您只有两个
用于。。在表达式中,为什么要删除它们?Marklogic是否支持
操作员?这肯定是一种不使用
的方法,因此
$tokenized值!(concat(“$i/*:”,)
会用$j重写你的第二个
。但是你最好先解释一下为什么你不想用
来处理
表达式。我的第一个“for”会遍历所有的文档,无论我从搜索查询中得到什么,这都会降低我的性能。你只有两个
for..in
表达式,你为什么要删除它们它们?Marklogic是否支持
运算符?这肯定是一种不使用
的方法,因此
$标记化值!(concat(“$i/*:”,)
将用$j重写你的第二个
。但是你最好先解释一下为什么你不想用
作为
表达式。我的第一个“for”将遍历所有文档,无论我从搜索查询中得到什么,这都会降低我的性能。Rob-谢谢:)我将尝试使用cts:element-value元组。事实上,使用XQ31,您可以编写
$标记化值!(“$I/*:“| |”)
MarkLogic的
1.0-ml
XQuery语法模式既支持
又支持
|
,以及其他一些较新的XQuery运算符和功能。..Rob-谢谢:)我还将尝试使用cts:element-value元组。事实上,使用XQ31,您可以编写
$标记化值!(“$i//*:”| |。)
MarkLogic的
1.0-ml
XQuery语法模式同时支持
| |
,以及一些其他较新的XQuery操作符和功能。。