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

4 回答 4

4

您确实将文档的内容传递给 xdmp:document-delete 而不是它的 uri。您可以使用 example 派生 uri fn:base-uri(),但是像这样,您要删除的所有文档都首先从数据库中检索,这是不必要的。

相反,启用 URI 词典,并使用cts:uris来执行删除。分批删除 1000 个文档也可能是明智之举。

于 2012-07-12T16:34:15.350 回答
3

xdmp:document-delete() 获取文档的 URI,而不是节点。所以最简单的解决方法是将 $doc 包装在 base-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。

于 2012-07-12T16:42:28.723 回答
3

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

于 2012-07-13T23:06:43.070 回答
0

在最后一行,更改为

xdmp:document-delete(fn:base-uri($doc));
于 2014-09-12T15:00:11.860 回答