MarkLogic允许使用伪“目录”式结构在数据库内组织文档,该结构由加载任何给定文档时使用的URI定义。这些URI用于查找和查询文档(使用fn:doc()
),并列出特定目录或子目录中的所有文档(使用xdmp:directory()
)。
但是,似乎没有任何一种方式可以“查看”或列出数据库中文档的所有目录或子目录,就像您在典型的目录结构文件系统中所期望的那样。在线上和SO上有一些旧的解决方案,它们指出了在db中列出根目录的方法,但没有一种方法允许子目录,并且没有一种方法像运行单个代码来生成目录的完整列表一样简单。 / p>
是否可以在MarkLogic中列出数据库中的所有根目录和/或子目录?
答案 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此处使用的初始代码。