如何列出MarkLogic数据库中的所有根目录和子目录?

时间:2019-06-28 23:17:15

标签: xquery marklogic

MarkLogic允许使用伪“目录”式结构在数据库内组织文档,该结构由加载任何给定文档时使用的URI定义。这些URI用于查找和查询文档(使用fn:doc()),并列出特定目录或子目录中的所有文档(使用xdmp:directory())。

但是,似乎没有任何一种方式可以“查看”或列出数据库中文档的所有目录或子目录,就像您在典型的目录结构文件系统中所期望的那样。在线上和SO上有一些旧的解决方案,它们指出了在db中列出根目录的方法,但没有一种方法允许子目录,并且没有一种方法像运行单个代码来生成目录的完整列表一样简单。 / p>

是否可以在MarkLogic中列出数据库中的所有根目录和/或子目录?

1 个答案:

答案 0 :(得分:2)

使用MarkLogic的URI词典和一些基本的字符串操作实际上是一种简单的方法。 (有关更多信息,请参见https://docs.marklogic.com/cts:uris

要查看MarkLogic数据库中给定目录内的所有子目录,只需在查询控制台中运行以下代码,并将$root-dir变量设置为所需的父目录即可。要在MarkLogic中从根开始查找所有目录,请将$root-dir设置为"/"

此代码列出所有个嵌套子目录 递归 ,显示从指定根目录开始的完整目录层次结构。

    (: List all subdirectories present within a ML root directory :)
    xquery version "1.0-ml";

    let $root-dir := "/directory/"

    let $uris := cts:uris((), (), cts:directory-query($root-dir, "infinity"))
    let $subdirs :=
      for $uri in $uris
      return fn:string-join(fn:tokenize(fn:replace($uri, $root-dir, "/"), "/")[1 to fn:last() - 1], "/") || "/"
    let $distinct-subdirs := fn:distinct-values($subdirs)
    return $distinct-subdirs

感谢mblakele此处使用的初始代码。

相关问题