我正在尝试更新一个与当前数据库不同的数据库中的文档。但它让我犯了以下错误-
XDMP-UPEXTNODES: xdmp:node-replace(fn:doc("/C:/Users/Downloads/abc.csv-0-2")/*:envelope/*:root/*:Status, <Status>1000</Status>) -- Cannot update external nodes我在用下面的代码-
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
有什么建议吗?
发布于 2018-07-16 08:25:42
您不能将数据库节点作为变量传递给这样的更新目的。相反,您应该传递数据库uri,并获得要在调用的函数中更新的元素的新副本。也许您可以在被调用的函数中推动更多的逻辑,以使这更容易。类似于:
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上放置一个读锁,导致被调用的函数无法更新它。
哈哈!
https://stackoverflow.com/questions/51357037
复制相似问题