2012-07-12 43 views
2

我想刪除所有匹配謂詞的文檔。我想到的查詢如下,但沒有任何東西從數據庫中刪除。刪除與查詢匹配的所有文檔?

我懷疑這是因爲$ doc被設置爲文檔的XML值而不是文檔本身。任何人都可以對此有所瞭解嗎?

xquery version "1.0-ml"; 
for $doc in cts:search(fn:collection("MYCOLLECTIONNAME")/MyDocumentRoot, 
    cts:or-query((
    cts:element-range-query (xs:QName("MyElement"), "=", "MyElementValue"), 
    )), "unfiltered") 
    return xdmp:document-delete($doc); 

文件看起來像

<MyDocumentRoot> 
    <MyElementName>MyElementValue</MyElementName> 
</MyDocumentRoot> 

回答

4

你確實是傳遞文件的內容到xdmp:代替文檔刪除其URI的。您可以使用例如fn:base-uri()來派生uri,但是像這樣,要刪除的所有文檔都是首先從數據庫中檢索的,這是不必要的。

取而代之,請啓用URI詞典,並使用cts:uris進行刪除。批量刪除1000個文檔也可能是明智的做法。

HTH!

+0

共發現關於使用URI以及配料。 – 2012-07-13 00:15:04

+1

注意'fn:base-uri'的'xml:base'屬性!大多數時候使用'xdmp:node-uri'更安全。 – mblakele 2014-09-12 15:14:12

+0

'xml:base'沒有經常使用,但是'xdmp:node-uri'可能更安全,如果您不確定是否不存在xml:base屬性會導致混亂。還有'fn:document-uri',但明確地只對文檔節點起作用,所以除非你確定手邊有doc節點,否則你可以將它與'fn:root'結合起來。然後再次xdmp:node-uri就是一個簡短的例子.. – grtjn 2014-09-13 21:07:02

3

xdmp:document-delete()獲取文檔的URI而不是節點。因此最簡單的解決將是包裹$文檔中基URI(。):

return xdmp:document-delete(base-uri($doc)) 

但是,如果你啓用了URI的詞彙,你可以寫這樣一個更快的查詢:

let $query := cts:and-query((
       cts:collection-query("MYCOLLECTIONNAME"), 
       cts:or-query((...)) (: put your full or query here :) 
      )) 
for $uri in cts:uris("",(),$query) return xdmp:document-delete($uri) 

在後一種情況下,您不必閱讀每個文檔以獲取其URI。

3

xdmp:collection-delete("MYCOLLECTIONNAME")也值得一提。

0

在最後一行,更改爲

xdmp:document-delete(fn:base-uri($doc)); 
+0

注意'xml:base'屬性和'fn:base-uri'!大多數時候使用'xdmp:node-uri'更安全。 – mblakele 2014-09-12 15:14:29

相關問題