【问题标题】:List of all document names in marklogic forestmarklogic 森林中所有文档名称的列表
【发布时间】:2018-04-24 15:02:46
【问题描述】:

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

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

森林ABC有

A.xml
B.xml
C.xml

等等……

【问题讨论】:

    标签: xquery marklogic marklogic-7


    【解决方案1】:

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

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

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

    【讨论】:

    • 实际问题是其中一个磁盘在 ML 中出现故障,并且几个森林(比如说 x,y)已恢复。在该过程中,x,y 最终得到了重复的文档,这些文档位于剩余的森林(a,b,c ..)。所以当我将文档加载到 ML 时,我收到错误消息说 doc 存在于森林 a 和森林 x、森林 b 和森林 x 中。所以我正在从森林中删除 dup 文档x 并再次重新加载。因为我手头有文档(我将要加载),我可以看到,如果我在森林 x 中找到文档的名称,那么我可以在实际加载之前删除 dup 文档。我是不确定我的想法是否正确。
    • 我相信我的问题应该是“如何在 ML 森林中查找和删除所有重复文档”。
    • @Mads Hansen - 我一直在关注相同的链接来删除重复的文档。就我而言,我在森林 x 中创建了 100 多个 dup 文档,我仅在加载内容后才发现这些文档。除了在加载后找到 dup 文档之外,有什么方法可以通过比较森林中的文档并批量删除来找到 dup 文档。
    【解决方案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 job 运行,其中在 URIS-MODULE 中选择了 forsts URI,然后在 PROCESS-MODULE 中单独处理每个检查/删除。

    【讨论】:

    • 非常感谢。我按原样尝试了您的代码,但遇到了超时问题。我看不到你的最新评论。所以我所做的是从森林中提取所有重复的文档,这些文档陷入异常块并使用链接中给出的代码立即删除它们。 help.marklogic.com/knowledgebase/article/View/22/0/…
    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多