![](/img/trans.png)
[英]how to document insert with the collections in Marklogic using XQuery
[英]Marklogic : Insert and retrieve document using xquery in the same run
使用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)
};
是的,這與交易有關。 默認情況下, XQuery
程序的整個主體在單個事務中運行。 與RDBMS
事務不同,在ML中,事務隱藏了它所做的事情。 在事務的整個生命周期中,您對數據庫的視圖保持不變。 僅當程序完成時,更改才會提交並可見。
您可以通過多種方式解決此問題,建議您使用本教程。
盡管有關交易的建議在一般情況下都是正確的,但可以輕松處理此情況。
您已經在內存中存儲了文檔(示例中的<root />)作為xdmp:document-insert()
的第二個參數。
您可以將文檔分配給變量。 將文檔傳遞給xdmp:document-insert()
,然后返回文檔。
如果要在同一運行中同時執行這兩項操作,請使用xdmp:eval()函數創建文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.