0

さて、私たちはかなり単純なシナリオであるべきものを持っています。

Marklogic dlsライブラリを使用してドキュメントを管理しているため、以下にコードを示します。

渡される変数は次のようになります。

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

この関数は、ドキュメント内のいくつかの異なるノードを置き換え/更新します。チェックインしてから、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>

助けてくれてありがとう、

わたしは

4

1 に答える 1

3

問題は、xdmp:node-*関数がデータベースに保存されているドキュメントを操作するという事実にあります。これらの変更を保存するために更新を呼び出す必要はありません。ほとんどの場合、dls更新関数がドキュメント全体を置き換え、それらのノード更新との競合を引き起こします。

インメモリアップデートを探しています。dlsライブラリ自体には、まさにそれを実行するいくつかの関数が含まれていますが、それらはプライベートです。そのために、以下で説明するヘルパーライブラリを調べることをお勧めします。または、変更が比較的単純な場合は、ドキュメントを再構築するだけです。これは非常に頻繁に行われ、パフォーマンスに影響はありません。

mem-update:https ://github.com/marklogic/commons/tree/master/memupdate

HTH!

于 2013-01-04T20:43:47.287 に答える