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

Incremental Counter giving XDMP-CONFLICTINGUPDATES in 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"

很难根据这个有限的样本判断您的代码在做什么。

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

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"

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

回应您的评论。要获得此技术的非常简单的演示,请比较以下结果:

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