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

Marklogic:在同一次运行中使用xquery插入和检索文档,xquery,marklogic,Xquery,Marklogic,使用xquery在Marklogic中需要类似的东西。 获取位置中存在的文档,如果不存在,请使用xdmp:document-insert()创建文档,然后使用fn:doc()检索文档 在第一次运行时,文档不存在。因此,它创建文档,但不获取任何内容。在第二次运行中,将检索在第一次运行中创建的文档。但是,我想在同一次跑步中同时做这两件事 我知道我错过了一些简单的东西。单笔交易是否如此?这两条语句都在单独的行中,因此不确定这是否是一个单独的事务案例 declare function lk:cr

使用
xquery
Marklogic
中需要类似的东西。 获取位置中存在的文档,如果不存在,请使用
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)
  };
声明函数lk:createXmlIfNotPresent(){
让$xml_dir:=“应用程序/测试”
让$xml\u完整路径:=“app/test/test.xml”
让$dir\u uri:=cts:uri匹配($xml\u dir)
让$dir_创建:=
如果(fn:empty($xml_dir))那么(
xdmp:目录创建($xml\u dir)
)else()
让$exists:=fn:doc可用($xml\u完整路径)
让$xml\u创建:=
如果($eq fn:false())存在,则(
xdmp:documentinsert($xml\u full\u path,,xdmp:default-permissions())
)else()
返回fn:doc($xml\u full\u path)
};

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

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

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

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


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

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


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

您已经将文档作为
xdmp:document-insert()
的第二个参数存储在内存中(在本例中)


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

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

您已经将文档作为
xdmp:document-insert()
的第二个参数存储在内存中(在本例中)


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

如果文档不存在,只需返回即可,而不是使用fn:doc。我希望将文档写入ML@grtjn。我会在同一个xqueryYou中的其他函数中使用此xml,只要您传递此函数的结果,而不是在任何地方使用fn:doc..您可以通过简单地返回它(如果它不存在)而不是使用fn:doc来避免事务混乱..我希望将文档写入ML@grtjn。我会在同一个xqueryYou中的其他函数中使用此xml,只要您传递此函数的结果,而不是到处使用fn:doc,您仍然可以这样做。。