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

时间:2018-04-24 15:02:47

标签: xquery marklogic marklogic-7

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

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

Forest ABC已经

A.xml
B.xml
C.xml

依旧......

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

为了列出特定林中的所有URI,您可以使用cts:uris()并在第5个参数中指定forest-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,然后在 PROCESS-MODULE