如何在 MarkLogic 中找到所有的根目录
How to find all the root directories in MarkLogic
我想知道如何获取 MarkLogic 数据库中的所有顶级目录。
cts:uris()
可用于此目的:
cts:uris()[matches(., '^[^/]*/$')]
但一定有比匹配每个 URI 列出几个顶级目录更有效的方法!
假设您不想要求目录属性,并且您对目录的定义是存在一个包含“/”但不以“/”结尾的 URI 的文档,xmlsh 为此实现了两个实现,都不是 100% 理想的——因为没有直接的方法。除了目录属性之外,"directory" 的概念不是 MarkLogic 中的直接建模概念 - 类似于 AWS S3 密钥,它是为了派生方便而不是根概念。要有效地推断出 'common prefixes' 的列表,您需要启用 URI 词典。然后就可以利用各种URI搜索了。参见
例如匹配根下的 'directories' 或顶层 'directories' 如果 $urimatch 是 "" 。这并不完美,但它确实处理了一种常见情况,即完整的 URL 被用作数据库中的 URI,例如“http://www.marklogic.com/document”
declare variable $start external := 1 ;
declare variable $end external := 1000;
declare variable $urimatch external := "" ;
fn:distinct-values(
for $d in cts:uris("","any" )
where ($urimatch eq "" or contains( $d , $urimatch ) )
return
if( matches( $d , "^[a-zA-Z]+://" ) ) then
replace( $d , "(^[a-zA-Z]+://[a-zA-Z0-9_.-]+/).*","" )
else
if( contains( $d , "/" ) ) then
substring-before( $d , "/" ) || "/"
else
$d
)[ $start to $end ]
您无法绕过拉取每个 URI。但是,这是另一种获取不同根目录列表的方法。
let $dir := (
let $current := map:map()
let $_ := map:put($current, "element", "")
for $uri in cts:uris()
let $toks := fn:tokenize($uri, "/")
let $element := if (map:get($current, "element") ne $toks[2]) then element directory { $toks[2] } else ()
let $_ := map:put($current, "element", $toks[2])
return if ($element/text() ne "") then $element else ()
)
let $doc := document { element root { $dir } }
return $doc
我想知道如何获取 MarkLogic 数据库中的所有顶级目录。
cts:uris()
可用于此目的:
cts:uris()[matches(., '^[^/]*/$')]
但一定有比匹配每个 URI 列出几个顶级目录更有效的方法!
假设您不想要求目录属性,并且您对目录的定义是存在一个包含“/”但不以“/”结尾的 URI 的文档,xmlsh 为此实现了两个实现,都不是 100% 理想的——因为没有直接的方法。除了目录属性之外,"directory" 的概念不是 MarkLogic 中的直接建模概念 - 类似于 AWS S3 密钥,它是为了派生方便而不是根概念。要有效地推断出 'common prefixes' 的列表,您需要启用 URI 词典。然后就可以利用各种URI搜索了。参见
例如匹配根下的 'directories' 或顶层 'directories' 如果 $urimatch 是 "" 。这并不完美,但它确实处理了一种常见情况,即完整的 URL 被用作数据库中的 URI,例如“http://www.marklogic.com/document”
declare variable $start external := 1 ;
declare variable $end external := 1000;
declare variable $urimatch external := "" ;
fn:distinct-values(
for $d in cts:uris("","any" )
where ($urimatch eq "" or contains( $d , $urimatch ) )
return
if( matches( $d , "^[a-zA-Z]+://" ) ) then
replace( $d , "(^[a-zA-Z]+://[a-zA-Z0-9_.-]+/).*","" )
else
if( contains( $d , "/" ) ) then
substring-before( $d , "/" ) || "/"
else
$d
)[ $start to $end ]
您无法绕过拉取每个 URI。但是,这是另一种获取不同根目录列表的方法。
let $dir := (
let $current := map:map()
let $_ := map:put($current, "element", "")
for $uri in cts:uris()
let $toks := fn:tokenize($uri, "/")
let $element := if (map:get($current, "element") ne $toks[2]) then element directory { $toks[2] } else ()
let $_ := map:put($current, "element", $toks[2])
return if ($element/text() ne "") then $element else ()
)
let $doc := document { element root { $dir } }
return $doc