首页 > 解决方案 > 如何列出 MarkLogic 数据库中的所有根目录和子目录?

问题描述

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

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

有没有办法在 MarkLogic 中列出数据库中的所有根目录和/或子目录?

标签: xquerymarklogic

解决方案


实际上有一个简单的方法可以做到这一点,使用 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提供此处使用的初始代码。


推荐阅读