如何在 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搜索了。参见

https://github.com/DALDEI/xmlsh/blob/master/extensions/marklogic/src/org/xmlsh/marklogic/ui/listRootDirectory.xquery

例如匹配根下的 '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