Как мы можем получить все количество документов баз данных MarkLogic в одном коде XQuery?

#marklogic #marklogic-10

Вопрос:

Нам нужно создать отчет с помощью XQuery, где нам нужны такие сведения, как размеры базы данных и количество документов в базе данных(общая стоимость документов).

У нас был приведенный ниже код XQuery, из которого мы можем получить имена баз данных и размер базы данных, но мы также хотим включить количество документов базы данных, которые поступают в AdminUI.

 for $db-id in xdmp:databases()
let $db-name := xdmp:database-name($db-id)
let $db-size :=
  fn:sum(
    for $f-id in xdmp:database-forests($db-id)
    let $f-status := xdmp:forest-status($f-id)
    let $space := $f-status/forest:device-space
    let $f-name := $f-status/forest:forest-name
    let $f-size :=
      fn:sum(
        for $stand in $f-status/forest:stands/forest:stand
        let $stand-size := $stand/forest:disk-size/fn:data(.)
        return $space
      )
    return $f-size
  )
order by $db-size descending
return $db-name || " = " || $db-size
 

что-то вроде

 return $db-name || " = " || $db-size || "=" || $db-count
 

Используя ниже, мы можем получить количество документов в одной базе данных(независимо от того, что выбрано в раскрывающемся списке QC), но мне нужно выполнить команду ниже для всех баз данных в одном сценарии.

 xdmp:estimate(doc())
 

Есть какая-нибудь помощь или предложения по этому поводу? Заранее спасибо за помощь.

Ответ №1:

Вы можете извлечь document-count с xdmp:forest-counts() и добавить их, как вы это сделали для размера:

 declare namespace forest = "http://marklogic.com/xdmp/status/forest";
for $db-id in xdmp:databases()
let $db-name := xdmp:database-name($db-id)
let $db-size :=
  fn:sum(
    for $f-id in xdmp:database-forests($db-id)
    let $f-status := xdmp:forest-status($f-id)
    let $space := $f-status/forest:device-space
    let $f-name := $f-status/forest:forest-name
    let $f-size :=
      fn:sum(
        for $stand in $f-status/forest:stands/forest:stand
        let $stand-size := $stand/forest:disk-size/fn:data(.)
        return $space
      )
    return $f-size
  )
let $db-count := 
  fn:sum(
    for $forest-id in xdmp:database-forests($db-id)
    let $forest-counts := xdmp:forest-counts($forest-id)
    return $forest-counts/forest:document-count/fn:data(.)
  )
order by $db-size descending
return $db-name || " = " || $db-size || ", " || $db-count
 

Если бы вы действительно хотели использовать xdmp:estimate(doc()) , то могли бы использовать xdmp:invoke-function() и указывать содержимое database для выполнения в параметрах:

 declare namespace forest = "http://marklogic.com/xdmp/status/forest";
for $db-id in xdmp:databases()
let $db-name := xdmp:database-name($db-id)
let $db-size :=
  fn:sum(
    for $f-id in xdmp:database-forests($db-id)
    let $f-status := xdmp:forest-status($f-id)
    let $space := $f-status/forest:device-space
    let $f-name := $f-status/forest:forest-name
    let $f-size :=
      fn:sum(
        for $stand in $f-status/forest:stands/forest:stand
        let $stand-size := $stand/forest:disk-size/fn:data(.)
        return $space
      )
    return $f-size
  )
let $db-count := 
  xdmp:invoke-function(
    function(){ xdmp:estimate(doc())}, 
    <options xmlns="xdmp:eval">
      <database>{$db-id}</database>
    </options>)
order by $db-size descending
return $db-name || " = " || $db-size || ", " || $db-count