我想删除与某些谓词匹配的所有文档。我提出的查询如下,但没有从数据库中删除任何内容。
我怀疑这是因为$ 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>
答案 0 :(得分:4)
您确实将文档内容传递给xdmp:document-delete而不是uri。您可以使用例如fn:base-uri()
派生uri,但是像这样首先从数据库中检索要删除的所有文档,这是不必要的。
相反,启用URI词典,并使用cts:uris
进行删除。让批量删除1000个文档可能也是明智的。
HTH!
答案 1 :(得分:3)
xdmp:document-delete()接受文档的URI,而不是节点。所以最简单的解决方法是在base-uri(。)中包装$ doc:
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。
答案 2 :(得分:3)
xdmp:collection-delete("MYCOLLECTIONNAME")
也值得一提。
答案 3 :(得分:0)
在最后一行,改为
xdmp:document-delete(fn:base-uri($doc));