Как мне перечислить все корневые каталоги и подкаталоги в базе данных MarkLogic? - PullRequest
1 голос
/ 29 июня 2019

MarkLogic позволяет организовывать документы в базе данных, используя псевдо-"директорию", подобную структуре, определяемой URI, используемым при загрузке любого данного документа.Эти URI используются для поиска и запроса документов (с использованием fn:doc()) и для вывода списка всех документов в определенном каталоге или подкаталоге (с использованием xdmp:directory()).

Однако не представляется каким-либо способом «просмотреть» или перечислить все каталоги или подкаталоги, прикрепленные к документам в базе данных, как вы ожидаете в типичной файловой системе со структурой каталогов.В сети и на SO есть несколько старых решений, которые указывают способы составления списка корневых каталогов в БД, но ни одно из них не позволяет использовать подкаталоги, и ни одно из них не работает так просто, как запуск одного фрагмента кода для генерации полного списка каталогов.

Можно ли перечислить все корневые и / или подкаталоги в базе данных в MarkLogic?

1 Ответ

2 голосов
/ 29 июня 2019

На самом деле существует простой способ сделать это, используя URI-лексику MarkLogic и некоторые базовые манипуляции со строками. (Подробнее см. 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 за начальный код, использованный здесь.

...