簡體   English   中英

在 MarkLogic 中將文檔從一個數據庫復制到另一個數據庫 - xdmp:document-insert 失敗

[英]Copy documents from one database to another in MarkLogic - xdmp:document-insert Failing

我正在使用以下代碼將文檔從一個數據庫復制到 MarkLogic 中的另一個數據庫。 但我收到錯誤 - arg2 不是 node() 類型我正在嘗試的 xquery -

xquery version "1.0-ml";
for $doc in cts:search(doc(), cts:collection-query('Shipment'))
let $docuri := $doc/base-uri()
let $collections := xdmp:document-get-collections($docuri)
let $permissions := xdmp:document-get-permissions($docuri)
let $db-name := "GTM2_FINAL"
return
 xdmp:invoke-function(function()
  {
  xdmp:document-insert
  (
  $docuri, $docuri,
  <options xmlns="xdmp:document-insert" xmlns1="xdmp:eval">  
      <permissions>{xdmp:default-permissions()}</permissions>
      <collections>
           {
       <collection>GTM2_Shipment</collection>,
       <collection>Shipment</collection>
           }
        </collections>
      <database>{ xdmp:database("GTM2_TEST") }</database>
      <commit>auto</commit>
    </options>
    )
    }
    );

這是我得到的錯誤 -

[1.0-ml] XDMP-ARGTYPE: (err:XPTY0004) xdmp:document-insert(xs:anyURI("/shipment/test..."), xs:anyURI("/shipment/test..."), <options xmlns1="xdmp:eval" xmlns="xdmp:document-insert"><permissions>...</permissions>...</options>) -- arg2 is not of type node()

您的代碼有幾個問題,但第一個問題和錯誤消息告訴您的是xdmp:document-insert()的第二個參數不是節點。 您指定$docuri ,它是文檔 URI 的字符串值。 第二個參數應該是$doc

我看到的另一個問題是您將xdmp:document-insert()函數的參數與xdmp:invoke-function()的 options 參數混合在一起。 需要指定兩個不同的選項參數,並且元素綁定到兩個不同的命名空間。

xdmp:document-insert()的選項參數應該是:

<options xmlns="xdmp:document-insert">  
    <permissions>{xdmp:default-permissions()}</permissions>
    <collections>
      <collection>GTM2_Shipment</collection>
      <collection>Shipment</collection>
    </collections> 
</options>

或者如果你想使用文檔的權限和集合:

<options xmlns="xdmp:document-insert">  
    <permissions>{$permissions}</permissions>
  <collections>{$collections}</collections> 
</options>

xdmp:invoke-function()的選項參數是:

<options xmlns="xdmp:eval">
  <database>{ xdmp:database("GTM2_TEST") }</database>
  <commit>auto</commit>
</options>

如果您不想使用文檔中的集合或權限,則無需獲取它們。 我在之前的答案中提供的答案顯示了一種將它們與用於xdmp:document-insert()的舊 API 一起使用的方法,該 API 使用集合和權限作為特定參數,而不是在 options 參數中。

您讓變量$db-name的值為“GTM2_FINAL”,但不要使用它,而是在 eval 選項中硬編碼該值。 要么使用變量而不是字符串,要么去掉未使用的變量。

應用更改:

xquery version "1.0-ml";
for $doc in cts:search(doc(), cts:collection-query('Shipment'))
let $docuri := $doc/base-uri()
let $collections := xdmp:document-get-collections($docuri)
let $permissions := xdmp:document-get-permissions($docuri)
let $db-name := "GTM2_FINAL"
return
 xdmp:invoke-function(function()
  {
    xdmp:document-insert(
      $docuri, $doc,
      <options xmlns="xdmp:document-insert">  
        <permissions>{$permissions}</permissions>
        <collections>{$collections}</collections> 
      </options>
    )
   },
   <options xmlns="xdmp:eval">
      <database>{ xdmp:database($db-name) }</database>
      <commit>auto</commit>
   </options>
 );

如果它更容易, let還可以為選項設置命名變量,以使其更易於閱讀並保持實際函數調用更短:

xquery version "1.0-ml";
for $doc in cts:search(doc(), cts:collection-query('Shipment'))
let $docuri := $doc/base-uri()
let $collections := xdmp:document-get-collections($docuri)
let $permissions := xdmp:document-get-permissions($docuri)
let $document-insert-options := 
  <options xmlns="xdmp:document-insert">  
    <permissions>{$permissions}</permissions>
    <collections>{$collections}</collections> 
  </options>
let $db-name := "GTM2_FINAL"  
let $invoke-function-options := 
  <options xmlns="xdmp:eval">
    <database>{ xdmp:database($db-name) }</database>
    <commit>auto</commit>
  </options>
return
 xdmp:invoke-function(
   function(){ xdmp:document-insert($docuri, $doc, $document-insert-options)},
   $invoke-function-options
 ); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM