增量计数器在Marklogic中提供XDMP-CONFLICTINGUPDATES

时间:2018-06-19 12:10:17

标签: xml xquery counter marklogic

我想根据条件自动增加要插入的文档的URI,但是对于单个文档,它正在工作,对于多个文档,我得到XDMP CONFLICTINGUPDATES

代码:

if ($results) then 
    local:replace($results, $i )
else if($i) then
    (
        let $counter := 10000000
        let $uri := concat("/test-", ($counter+1),".xml")
        return (xdmp:document-insert($uri, $i , (), "collection"), "Document inserted")
    )
else "No document"

1 个答案:

答案 0 :(得分:4)

基于这种有限的采样,很难判断您的代码在做什么。

但是,这很可能是您的问题:

let $counter := 10000000
let $uri := concat("/test-", ($counter+1),".xml")
return (xdmp:document-insert($uri, $i , (), "collection"), "Document inserted")

如果您要在单个事务中多次将文档插入相同的URI,那么我希望您看到此错误。

对此有多种解决方案,但是很难在不知道自己要做什么的情况下知道哪个是最好的。最等效的解决方案是执行以下操作:

let $counter := map:map()
let $_ := map:put($counter, "counter", 1)

...

if ($results) then 
local:replace($results, $i )
else if($i) then
(
    let $counterValue := map:get($counter, "counter")
    let $_ := map:put($counter, "counter", $counterValue+1)
    let $uri := concat("/test-", ($counterValue),".xml")
    return (xdmp:document-insert($uri, $i , (), "collection"), "Document inserted")
)
else "No document"

这样,您将保留counter的最后一个值,并在每次插入文档时正确地增加它的值。请注意,根据代码的编写方式,您可能不需要映射来保存该值,但我强烈怀疑这样做。

响应您的评论。.对于此技术的非常简单的演示,请比较:

的结果
let $counter := 1

for $i in (1 to 10)
let $counter := $counter + 1
return $counter

收件人:

let $counter := map:map()
let $_ := map:put($counter, "counter", 1)

for $i in (1 to 10)
  let $counterValue := map:get($counter, "counter")
  let $_ := map:put($counter, "counter", $counterValue+1)
  return $counterValue