我想根据条件自动增加要插入的文档的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"
答案 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