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

Xquery 是否删除与查询匹配的所有文档?,xquery,marklogic,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"),

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

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

髓质值

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

相反,启用URI词典,并使用
cts:URI
进行删除。也可以明智地批量删除1000个文档

xdmp:document-delete()获取文档的URI,而不是节点。因此,最简单的修复方法是在基本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。

xdmp:collection delete(“MYCOLLECTIONNAME”)也值得一提。

在最后一行,更改为

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

完全了解如何使用URI和批处理。注意
xml:base
属性和
fn:base URI
!大多数情况下,使用
xdmp:node-uri
xml:base
是比较安全的,但是如果您不确定是否存在可能会把事情搞砸的xml:base属性,那么使用
xdmp:node-uri
可能更安全。还有
fn:documenturi
,但它只在文档节点上起作用,因此您可以将其与“fn:root”结合使用,除非您确定手头有文档节点。然后,xdmp:node-uri就是这方面的简写。注意
xml:base
属性中的
fn:base-uri
!大多数情况下,使用
xdmp:node-uri
更安全。
xdmp:document-delete(fn:base-uri($doc));