Marklogic:在同一次运行中使用xquery插入和检索文档

时间:2013-05-16 12:12:15

标签: xquery marklogic

使用Marklogicxquery中需要这样的内容。 获取位置中的文档(如果不存在)使用xdmp:document-insert()创建文档,然后使用fn:doc()检索文档。

在第一次运行中,文档不存在。所以它创建了文档,但没有获取任何内容。在第二次运行中,检索在第一次运行中创建的文档。但是,我想在同一场比赛中做到这两点。

我知道我在这里缺少一些简单的东西。是单一交易的情况吗?这两个陈述都是分开的,因此不确定是单个交易案例。

    declare function lk:createXmlIfNotPresent(){
       let $xml_dir := "app/test"
       let $xml_full_path := "app/test/test.xml"
       let $dir_uri := cts:uri-match($xml_dir)
       let $dir_creation :=
       if(fn:empty($xml_dir)) then (
            xdmp:directory-create($xml_dir)
        )else()
       let $exists := fn:doc-available($xml_full_path)
       let $xml_creation :=
       if($exists eq fn:false()) then (
        xdmp:document-insert($xml_full_path,<root></root>,xdmp:default-  permissions())
       )else()
       return fn:doc($xml_full_path)
  };

3 个答案:

答案 0 :(得分:3)

是的,这与交易有关。默认情况下,XQuery程序的整个主体在单个事务中运行。与RDBMS交易不同,在ML中,交易隐藏它的作用。在整个交易过程中,您对数据库的看法保持不变。只有在程序完成后,才会提交并显示更改。

您可以通过各种方式解决这个问题,我建议您使用本教程。

https://docs.marklogic.com/guide/app-dev/transactions

答案 1 :(得分:1)

虽然有关交易的建议适用于一般情况,但这种情况可以简单地处理。

您已将内存中的文档(示例中为&lt; root /&gt;)作为xdmp:document-insert()的第二个参数。

您可以将文档分配给变量。将文档传递给xdmp:document-insert(),并返回文档。

答案 2 :(得分:0)

如果要在同一次运行中同时使用xdmp:eval()函数来创建文档。