插入文档并在MarkLogic中的同一事务中读取文档

时间:2019-01-07 17:23:23

标签: xquery marklogic

下面是我用于其中一项功能的代码段

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个文档,然后仅在同一函数调用中读取它们

1 个答案:

答案 0 :(得分:1)

您执行衍生程序的代码本身不会执行更新,因此将在所谓的查询模式下运行。在查询模式下,仅显示代码开始之前的更新。

您可以尝试以更新模式(declare option xdmp:transaction-mode "update";)运行,但是通常更容易产生或评估更新的计数/读取。例如。将xdmp:estimate包裹在xdmp:spawn-function中,结果也为true

HTH!