0

好吧,我们有一个非常简单的场景。

我们利用 Marklogic dls 库来管理文档,下面是代码

传入的变量如下所示:

  $doc: =<root>
            <node1>
              <subnode/></node1>
            <node2>
            <status/>
            </node2>
     <root>

该函数替换/更新文档中的几个不同节点。签入,然后返回 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>

非常感谢您的帮助,

我是

4

1 回答 1

3

问题在于 xdmp:node-* 函数对存储在数据库中的文档进行操作。您无需调用更新来保存这些更改。很可能 dls update 函数替换了整个文档,导致与那些节点更新发生冲突。

您正在寻找内存中的更新。dls 库本身包含一些执行此操作的函数,但这些函数是私有的。我建议查看下面提到的帮助程序库,或者如果更改相对简单,您可以重建文档。这是经常进行的,并且不会影响性能。

内存更新:https ://github.com/marklogic/commons/tree/master/memupdate

于 2013-01-04T20:43:47.287 回答