如何在MarkLogic中查找所有根目录

如何在MarkLogic中查找所有根目录,marklogic,Marklogic,我想知道如何在MarkLogic数据库中获取所有顶级目录 cts:uri()可用于此目的: cts:uris()[matches(., '^[^/]*/$')] 但一定有比匹配每个URI以列出几个顶级目录更有效的方法 假定您不需要目录属性,并且您对目录的定义是存在一个URI包含“/”但不以“/”结尾的文档,xmlsh为此实现了两种实现,这两种实现都不是100%理想的,因为没有直接的方法。除了目录属性外,“目录”的概念在MarkLogic中不是一个直接建模的概念-类似于AWS S3键,它是一个派

我想知道如何在MarkLogic数据库中获取所有顶级目录

cts:uri()
可用于此目的:

cts:uris()[matches(., '^[^/]*/$')]

但一定有比匹配每个URI以列出几个顶级目录更有效的方法

假定您不需要目录属性,并且您对目录的定义是存在一个URI包含“/”但不以“/”结尾的文档,xmlsh为此实现了两种实现,这两种实现都不是100%理想的,因为没有直接的方法。除了目录属性外,“目录”的概念在MarkLogic中不是一个直接建模的概念-类似于AWS S3键,它是一个派生便利性而不是根概念。为了有效地推断“公共前缀”列表,您需要启用URI词典。然后您可以使用各种URI搜索。看

例如,匹配根目录下的“目录”,或匹配顶级“目录”(如果$urimatch为“”)。这并不完美,但它可以处理一种常见情况,即在数据库中使用完整URL作为URI,例如“”


你不能到处拉每个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 

是的,没错。我希望有一个内置函数实现与后面函数相同的逻辑,例如,并且您的解决方案比我的更通用,因为它支持HTTP URI。为了总结您的答案,我建议您获取所有“根目录”的列表您必须查看数据库中的所有现有URI,并且所提出的匹配模式太弱,因为它会考虑“根目录”是“http://”,而应该是“”这是正确的吗?
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