1

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

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

森林ABC有

A.xml
B.xml
C.xml

等等...

4

2 回答 2

4

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

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

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

于 2018-04-24T15:30:41.330 回答
2

为了列出来自特定林的所有 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 作业运行,其中在URIS-MODULE中选择了 forsts URI ,然后在PROCESS-MODULE中单独处理每个检查/删除。

于 2018-04-25T02:16:26.057 回答