2012-11-26 87 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