首页 > 解决方案 > marklogic xquery 如何提交更新,然后可以通过以下行在同一个 xquery 函数中使用更新?

问题描述

我在 Windows 10 上使用 marklogic 10。

我有一个工作流程,我想记录每个步骤的信息。所以我想在数据库中有类似的东西,我更新数据,提交,然后我可以在下面的代码中立即使用这些数据。这是可行的吗?如何?

例如,在下面的示例代码中,假设我是第一次写日志,我想在我写日志之前创建文档。所以我创建了日志文档,提交,然后我在这个日志文档中插入了一个日志节点。但是似乎创建了日志文档,但是日志节点没有插入到日志文档中。我应该如何使它工作?这个想法是我想要一个可以将日志节点插入日志文件并且不受以下代码失败影响的功能

let $logFile := "/workflow/tracking/load-log.xml"
let $thisErrorMsg := <error>
                           <time>2020/04/10</time>
                           <desc>test</desc>
                     </error>
let $_log-file-exists := if(fn:empty(fn:doc($logFile)))
                        then
                            let $root := <errors></errors>
                            return
                            (
                              xdmp:set-transaction-mode("update")
                              ,
                              xdmp:document-insert(
                                  $logFile,
                                  $root,
                                  <options xmlns="xdmp:document-insert">  
                                    <permissions>{xdmp:default-permissions()}</permissions>
                                    <quality>10</quality>
                                  </options>)
                                ,
                               xdmp:commit()
                             )
                         else ()
return 
(
xdmp:set-transaction-mode("update")
,
xdmp:node-insert-child( fn:doc($logFile)/errors, $thisErrorMsg)
,
 xdmp:commit()
)

非常感谢您的帮助海伦

标签: marklogiccommit

解决方案


虽然有很多方法可以随心所欲,但我会避免这样做。您的代码将变得不必要地复杂。只需编写带有第一个错误的初始文档,或附加。

您还可以考虑将每个错误写成单独的文档。当你的日志文件开始变大时,它就不容易处理了。


推荐阅读