Xquery 是否删除与查询匹配的所有文档?
我想删除与某些谓词匹配的所有文档。我提出的查询如下,但没有从数据库中删除任何内容 我怀疑这是因为$doc被设置为文档的XML值,而不是文档本身。有人能解释一下吗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"),
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));