如何使用mem:node-replace将内容提交到数据库?

时间:2018-07-19 15:24:14

标签: xquery marklogic

我在使用mem:node-replace()的地方有一个代码。代码如下-

let $a := 
  for $i in $res
  let $uri := fn:base-uri($i)
  let $doc := fn:doc($uri)
  return if(fn:exists($doc) eq fn:true()) 
    then (
      (
        mem:node-replace($doc//*:NODE1,<NODE1>{doc($id)//*:NODE1}</NODE1>),
        mem:node-replace($doc//*:NODE2,<NODE2>{$curr_date}</NODE2>)
      ) 
    ) 
    else () 
return $a

我可以看到该值在LOG中被替换了,但是没有反映到数据库中。 我应该如何在数据库中提交/保存该节点替换?

有什么建议吗?

2 个答案:

答案 0 :(得分:6)

mem:replace函数仅更新内存中的节点。您已经创建了该文档的内存副本并对其进行了更改,但未在数据库中传播这些更改。这类似于更新按值而不是指针传递的变量。

在进行内存中更新之后,您需要将更新后的文档重新插入数据库中。

let $a := for $i in $res
let $uri := fn:base-uri($i)
let $doc := fn:doc($uri)
let $_update := 
  if (fn:exists($doc) eq fn:true())
  then (mem:node-replace($doc//*:NODE1, <NODE1>{doc($id)//*:NODE1}</NODE1>), 
    mem:node-replace($doc//*:NODE2, <NODE2>{$curr_date}</NODE2>))    
  else ()
return xdmp:document-insert($uri, $doc)

答案 1 :(得分:4)

如果您需要更新节点,我将使用xdmp:node-replace来替换磁盘上的节点。

这是文档中的一个示例: https://docs.marklogic.com/xdmp:node-replace

(: create an XML document :)
xdmp:document-insert("/example.xml",
    <a><b>bbb</b></a>);

(: replace the b node with a c node :)
xdmp:node-replace(doc("/example.xml")/a/b, <c>ccc</c>);

(: look at the new document :)
fn:doc("/example.xml")