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

実際、ドキュメントの内容を uri ではなく xdmp:document-delete に渡しています。たとえば を使用して 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 に答える