删除与查询匹配的所有文档?

时间:2012-07-12 13:30:08

标签: xquery marklogic

我想删除与某些谓词匹配的所有文档。我提出的查询如下,但没有从数据库中删除任何内容。

我怀疑这是因为$ 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 个答案:

答案 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));