下面是我用于其中一项功能的代码段
declare function local:matchCounts($Id as xs:string, $status as xs:string) as xs:int {
xdmp:estimate(cts:search(/count, cts:and-query((
cts:element-attribute-value-query(xs:QName("count"), xs:QName("Id"), $Id, "exact"),
cts:element-attribute-value-query(xs:QName("child"), xs:QName("MatchStatus"), $status, "exact")
)), "unfiltered"))
};
declare function local:saveCountsMatchC($Id as xs:string) {
let $evenCount := local:matchCounts($Id, "even")
let $oddCount := local:matchCounts($Id, "odd")
return ($evenCount, $oddCount)
};
declare function local:matchingProcess($Id as xs:string) {
let $total-records := 1000
let $batch-size := 50
let $pagination := 0
let $bs :=
for $records in 1 to fn:ceiling($total-records div $batch-size )
let $start := fn:sum($pagination + 1)
let $end := fn:sum($batch-size + $pagination)
let $_ := xdmp:set($pagination, $end)
return
xdmp:spawn-function
(
function() {
for $each at $pos in ($start to $end)
let $id := sem:uuid-string()
let $xml := if(($pos mod 2) eq 0) then <count Id='{$Id}'><child MatchStatus='even'></child></count>
else <count Id='{$Id}'><child MatchStatus='odd'></child></count>
return xdmp:document-insert(concat("/", $id, ".xml"), $xml)
},
<options xmlns="xdmp:eval"><result>{fn:true()}</result><commit>auto</commit><update>true</update></options>
)
let $_ := $bs
return local:saveCountsMatchC($Id)
};
local:matchingProcess("1")
这里的要求是使用50个批处理量来迭代1000个文档,因此基本上我正在使用spawn函数创建20个大小为50的批处理,这将在我的数据库中插入1000个文档。 插入这些文档后,我需要在同一事务中阅读这些文档。这里有500个文档的MatchStatus ='odd'和500个文档的MatchStatus ='even' 查询应返回(500,500)作为输出;相反,它返回(0,0)
我正在使用<result>{fn:true()}</results>
选项,以便我的下一条语句等待所有派生任务完成,但不会发生。
有人可以帮助我解决这个问题吗?
注意:需要插入1000个文档,然后仅在同一函数调用中读取它们
答案 0 :(得分:1)
您执行衍生程序的代码本身不会执行更新,因此将在所谓的查询模式下运行。在查询模式下,仅显示代码开始之前的更新。
您可以尝试以更新模式(declare option xdmp:transaction-mode "update";
)运行,但是通常更容易产生或评估更新的计数/读取。例如。将xdmp:estimate
包裹在xdmp:spawn-function
中,结果也为true
。
HTH!