marklogic forest中所有文档名称的列表

List of all document names in marklogic forest

我只是想在森林中找到所有文档名称。

我知道林名称 (ABC),我需要找到该林 (ABC) 中的所有文档。我的输出应该是这样的。

森林 ABC 有

A.xml
B.xml
C.xml

等等...

搜索和词典查找可能会受到林的限制,因此您应该能够通过类似于以下的调用从 URI 词典中获取文档名称:

cts.values(cts.uriReference(), null, null, null, null, xdmp.forest('ABC'))

也就是说,在森林中查找文档名称的常见动机并不多。你想要完成什么?

为了列出来自特定森林的所有 URI,您可以使用 cts:uris() 并在第 5 个参数中指定森林 ID:

cts:uris((), (), cts:true-query(), (), xdmp:forest("ABC"))

您的评论表明您尝试列出特定林中的所有 URI 的原因是为了删除重复的 URI。

下面的代码可用于获取指定林中的所有 URI,如果它们是重复的,然后将它们从该林中删除。

如果您尝试读取文档属性并抛出 XDMP-DBDUPURI 异常,捕获该异常,然后从问题林中的不同事务中删除该文档。

(: update this with the name of problem forest :)
declare variable $PROBLEM-FOREST := xdmp:forest("ABC"); 
declare variable $URIS := cts:uris((), (), cts:true-query(), (), $PROBLEM-FOREST);

for $uri in $URIS
return
  try {
      let $properties := xdmp:document-get-properties($uri, xs:QName("foo"))
      return ()
  } catch($e) {
    if ($e/error:code = "XDMP-DBDUPURI") then
      xdmp:invoke-function(
        function(){ xdmp:document-delete($uri) },
        <options xmlns="xdmp:eval">
          <isolation>different-transaction</isolation>
          <database>{$PROBLEM-FOREST}</database>
        </options>
      )  
    else ()
  }

根据此林中的文档数量,您可能 运行 遇到超时问题。您可以将 运行 视为 CORB job,其中在 URIS-MODULE 中选择 forsts URI,然后在 inspection/delete 中单独处理每个 inspection/delete 过程模块.