簡體   English   中英

Marklogic:在同一運行中使用xquery插入和檢索文檔

[英]Marklogic : Insert and retrieve document using xquery in the same run

使用xqueryMarklogic需要這樣的東西。 獲取某個位置存在的文檔,如果不存在,則使用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)
  };

是的,這與交易有關。 默認情況下, XQuery程序的整個主體在單個事務中運行。 RDBMS事務不同,在ML中,事務隱藏了它所做的事情。 在事務的整個生命周期中,您對數據庫的視圖保持不變。 僅當程序完成時,更改才會提交並可見。

您可以通過多種方式解決此問題,建議您使用本教程。

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

盡管有關交易的建議在一般情況下都是正確的,但可以輕松處理此情況。

您已經在內存中存儲了文檔(示例中的<root />)作為xdmp:document-insert()的第二個參數。

您可以將文檔分配給變量。 將文檔傳遞給xdmp:document-insert() ,然后返回文檔。

如果要在同一運行中同時執行這兩項操作,請使用xdmp:eval()函數創建文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM