How to update nodes in a different Database or how to update external nodes ?- XDMP-UPEXTNODES

喜你入骨 提交于 2019-12-11 08:13:54

问题


I am trying to update a document in a different Database then my current DB. But it is giving me the below error-

XDMP-UPEXTNODES: xdmp:node-replace(fn:doc("/C:/Users/Downloads/abc.csv-0-2")/*:envelope/*:root/*:Status, <Status>1000</Status>) -- Cannot update external nodes

I am using the below code-

let $temp := 
  for $i in $result
  let $error := $i/*:envelope/*:ErrorMessage
  let $status := $i/*:envelope/*:Status
  return 
    if(fn:exists($i) eq fn:true()) then (
      xdmp:invoke-function(
        function() { 
          xdmp:node-replace($status,<Status>1000</Status>),
          xdmp:node-replace($error,<ErrorMessage>Change Error in other Database-2</ErrorMessage>)  
        },
        <options xmlns="xdmp:eval">
          <database>{xdmp:database("DATABASE-2")}</database>
        </options>))
    else ()

I want to update the Error and Status node of my Database-2.

$result is the document i fetched from Database-2.

This code i am running from Database-1

Any Suggestions ?


回答1:


You cannot pass database nodes as variable for updating purposes like that. Instead you should pass through the database uri, and get a fresh copy of the element you'd like to update inside the invoked function. Maybe you can push a bit more logic inside the invoked function to make that easier. Something like:

for $i in $result
let $uri := xdmp:node-uri($i)
return xdmp:invoke-function(function() {
  let $doc := fn:doc($uri)
  let $error := $doc/*:envelope/*:ErrorMessage
  let $status := $doc/*:envelope/*:Status
  return if(fn:exists($doc) eq fn:true()) then (
    xdmp:node-replace($status, <Status>1000</Status>),
    xdmp:node-replace($error, <ErrorMessage>Change Error in other Database-2</ErrorMessage>)
  ) else ()
}, map:entry("database", xdmp:database("DATABASE-2")))

Be careful though. It sounds like $i is pointing to the actual document in Database-2 as well, and it could easily result in dead-locks; the invoking query could be putting a read lock on $i, causing the invoked function to be unable to update it.

HTH!



来源:https://stackoverflow.com/questions/51357037/how-to-update-nodes-in-a-different-database-or-how-to-update-external-nodes-x

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!