首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更新不同数据库中的节点或如何更新外部节点?- XDMP-UPEXTNODES

如何更新不同数据库中的节点或如何更新外部节点?- XDMP-UPEXTNODES
EN

Stack Overflow用户
提问于 2018-07-16 07:54:22
回答 1查看 295关注 0票数 1

我正在尝试更新一个与当前数据库不同的数据库中的文档。但它让我犯了以下错误-

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

我在用下面的代码-

代码语言:javascript
复制
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 ()

我想更新我的数据库-2的错误和状态节点。

$result是我从数据库-2获取的文档。

我从数据库运行的这段代码-1

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-16 08:25:42

您不能将数据库节点作为变量传递给这样的更新目的。相反,您应该传递数据库uri,并获得要在调用的函数中更新的元素的新副本。也许您可以在被调用的函数中推动更多的逻辑,以使这更容易。类似于:

代码语言:javascript
复制
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")))

不过要小心点。听起来$i也指向数据库-2中的实际文档,它很容易导致死锁;调用查询可能会在$i上放置一个读锁,导致被调用的函数无法更新它。

哈哈!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51357037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档