2013-01-04 79 views
0

那么,我们有什么应该是一个非常简单的方案。MarkLogic dls库冲突更新

我们利用Marklogic DLS库来管理文件,所以下面的代码是

在外观还是通过像一个下面的变量:

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

的函数替换/更新几个不同的节点在doc 。检入并返回id版本对的映射。

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

回答

3

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

您正在寻找内存中的更新。 dls图书馆本身包含一些功能,但这些功能是私人的。我建议寻找下面提到的帮助程序库,或者如果更改比较简单,则可以重新构建文档。这很经常完成,并且没有性能问题。

MEM-更新:https://github.com/marklogic/commons/tree/master/memupdate

HTH!