好吧,我们应该有一个非常简单的场景。
我们利用Marklogic dls库来管理文档,所以下面是代码
传入的变量如下所示:
$doc: =<root>
<node1>
<subnode/></node1>
<node2>
<status/>
</node2>
<root>
该函数替换/更新doc中不同节点的几个。签入然后返回id-version对的映射。
declare function process-and-version($doc) {
for $sb in $doc/node1/subnode
return if ($sb/node3) then
xdmp:node-replace($sb/node3, <node3>foo</node>)
else
xdmp:node-insert-after($sb, <node3>foo</node>),
xdmp:node-replace($doc/status, <status>{$status}</status>),
dls:document-checkout-update-checkin("fn:base-uri($doc), $doc, "", fn:true()),
let $updated-version:=
<entry>{
let $version := c:get-latest-version($uri)
(:another function in our lib that uses cts:search:)
return ($doc/node1, <version>{$version}</version>)
}
</entry>
return $updated-version
};
我们正在使用XRAY测试驱动器并收到以下错误:
<error:error xsi:schemaLocation="http://marklogic.com/xdmp/error error.xsd" xmlns:error="http://marklogic.com/xdmp/error" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<error:code>XDMP-CONFLICTINGUPDATES</error:code>
<error:name></error:name>
<error:xquery-version>1.0-ml</error:xquery-version>
<error:message>Conflicting updates</error:message>
非常感谢您的帮助,
IM
答案 0 :(得分:3)
问题在于xdmp:node- *函数对存储在数据库中的文档进行操作。您无需调用更新来保存这些更改。很可能dls update函数替换整个文档,导致与那些节点更新冲突。
您正在寻找内存更新。 dls库本身包含一些功能,但这些功能是私有的。我建议查看下面提到的帮助库,或者如果更改相对简单,您可以重新构建文档。这种情况经常发生,并没有受到任何影响。
mem-update:https://github.com/marklogic/commons/tree/master/memupdate
HTH!