0

Marklogic通过使用需要这样的东西xquery。获取某个位置中存在的文档,如果不存在,则使用创建文档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)
  };
4

3 回答 3

3

是的,这与交易有关。默认情况下,程序的整个主体XQuery在单个事务中运行。与RDBMS事务不同,在 ML 中,事务隐藏了它所做的事情。您对数据库的看法在事务的整个生命周期内保持不变。只有当程序完成时,更改才会提交并可见。

您可以通过各种方式解决/使用此问题,我建议您阅读本教程。

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

于 2013-05-16T13:01:07.757 回答
1

虽然关于交易的建议对于一般情况是正确的,但这种情况可以简单地处理。

您已经将内存中的文档(示例中为 <root/>)作为xdmp:document-insert().

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

于 2013-05-16T14:45:36.340 回答
0

如果您想在同一运行中同时执行这两项操作,请使用 xdmp:eval() 函数来创建您的文档。

于 2013-05-16T12:19:07.297 回答