Xquery 如何在marklogic中列出目录中所有文档的所有URI

Xquery 如何在marklogic中列出目录中所有文档的所有URI,xquery,marklogic,Xquery,Marklogic,您好,我如何检索目录中所有文档的URI。我创建下面的xquery来实现这一点,但这没有帮助 for $i in xdmp:directory("/Test/performance/results/","infinity") let $k := document-uri(fn:doc($i)) return <li>{$k}</li> xdmp:directory(“/Test/performance/results/”,“infinity”)中$i的 设$k:=文档ur

您好,我如何检索目录中所有文档的URI。我创建下面的xquery来实现这一点,但这没有帮助

for $i in xdmp:directory("/Test/performance/results/","infinity")
let $k := document-uri(fn:doc($i))
return <li>{$k}</li>
xdmp:directory(“/Test/performance/results/”,“infinity”)中$i的

设$k:=文档uri(fn:doc($i))
返回
  • {$k}
  • 那么:

    xdmp:directory("/Test/performance/results/","infinity") !
        <li>{fn:document-uri(.)}</li>
    
    xdmp:directory(“/Test/performance/results/”,“infinity”)!
    
  • {fn:文档uri(.)}

  • XQuery不正确,因为$i已经是文档而不是URI 所以运行fn:doc($i)是行不通的

    Adam的解决方案将起作用(使深度变深),但可能会非常缓慢,因为它需要 获取每个文档。在大型数据库上,速度非常慢

    如果启用URI词典,则可以做得更好。 以下是xmlsh marklogic“ls”命令的源代码。。。嵌入其中的是相当简单的XQuery

    相关代码:

    xquery version "1.0-ml";
    declare variable $root external;
    for $p in fn:distinct-values( 
        for $d in cts:uris($root,"document", 
              if( $root eq "" ) then () else cts:directory-query($root,"infinity"))
        let $p := substring-after( $d , $root )
        where $d ne $root 
        return 
           if( contains($p,"/") ) then fn:concat($root , substring-before( $p , "/" ) , "/" )
        else 
           concat($root ,$p) 
        )
    where $p eq "" or $p ne $root
    return $p 
    
    这仅列出使用uri词典的目录的直接子目录

    这个程序有点复杂-它尝试使用uri词典,但如果失败,将恢复到xdmp:目录。。。它根据-r标志列出直接或递归


    为了提高效率,您应该使用URI词典

    cts:uris((), (), cts:directory-query("/Test/performance/results/","infinity"))
    

    有关文档,请参阅。

    SMO的良好使用。或者
    xdmp:directory(“/Test/performance/results/”,“infinity”)/document uri(.)/element li{.}
    也应该可以。当然可以,但我个人认为SMO(简单映射操作符)方法更具可读性。它真的需要获取每个文档吗?我更希望ML能够足够聪明地优化这一点。