2012-11-26 94 views
0

我想在本質上清空MarkLogic中目錄($目錄)的內容而不刪除目錄本身。使用XQuery我曾嘗試以下:使用xquery刪除目錄內容

let $_ := xdmp:directory-delete($directory) 
return xdmp:directory-create($directory) 

和操作的順序:

(xdmp:directory-delete($directory), xdmp:directory-create($directory)) 

我得到的錯誤「目錄已存在」。

我可以嘗試遍歷目錄中的每個文件並刪除它們,但這會讓目錄本身。我想徹底清除目錄中的所有內容。有任何想法嗎?

回答

0

我發現你必須使用xdmp:eval()函數在不同的事務中運行這些命令中的每一個。執行以下操作將起作用。

let $deleteCommand := "declare variable $directory as xs:string external; xdmp:directory-delete($directory)" 
let $createCommand := "declare variable $directory as xs:string external; xdmp:directory-create($directory)" 
let $_ := xdmp:eval($deleteCommand, (xs:QName("directory"), $directory),<options xmlns="xdmp:eval"><isolation>different-transaction</isolation><prevent-deadlocks>false</prevent-deadlocks></options>) 
let $_ := xdmp:eval($createCommand, (xs:QName("directory"), $directory),<options xmlns="xdmp:eval"><isolation>different-transaction</isolation><prevent-deadlocks>false</prevent-deadlocks></options>) 
return $_ 

在eval中運行其中一個命令並調用另一個命令不起作用,因爲這會產生死鎖。

儘管有這個答案,我仍然對刪除目錄內容的解決方案感興趣,如果任何人有一個。

+0

http://docs.marklogic.com/guide/app-dev/transactions#id_24388值得一讀。它解釋了爲什麼你需要兩個evals。您總是希望在該部分的「調用語句」表的第一行中運行更新。也就是說,當涉及多個更新時,它們應該總是由只讀查詢控制。從更新中調用更新至多是不可能的,而且最危險。 – mblakele