Marklogic подсчитывать старые документы, используя cts: поиск по FLWOR

Вопрос по использованию cts: поиск по FLOWR. У меня есть xqy, который работает со всеми документами в базе данных и проверяет элемент, имеющий метку времени. Мы создали эту временную метку при вставке документа. Цель состоит в том, чтобы удалить документы старше x дней.

Теперь мне нужно знать, сколько у меня документов, которые старше x дней, чтобы я мог попробовать работу CORB, чтобы удалить их.

Мой запрос пока работает:

xquery version "1.0-ml";
declare namespace j = "http://marklogic.com/xdmp/json/basic";
declare namespace dikw = 'http://www.example.com/dikw_functions.xqy';

(:let $foo := cts:uris((),(), cts:not-query(cts:element-query(xs:QName("j:dikwmetadata"), cts:element-query(xs:QName("j:data"), cts:and-query(()))))):)
let $uris := cts:uri-match("/twitter/*")[1 to 10]
let $today := fn:current-date()
let $days := xs:dayTimeDuration("P30D")

let $today_minus_x := xs:dateTime($today - $days)

for $uri in $uris (:cts:search(doc(), $random-query):)
    let $doc_dikw_date := xdmp:parse-dateTime("[Y0001]-[M01]-[D01] [h01]",xs:string(fn:doc($uri)//j:dikwmetadata//j:timestamp))
    let $to_old := if ($today_minus_x >= $doc_dikw_date)
    then
        true() (: deleted document:)
    else
        false()

return ($uri,$to_old) 

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

Я искал в CTS: искать что-то вроде:

(:
let $uris2 := cts:search($uris,cts:query(xdmp:parse-dateTime("[Y0001]-[M01]-[D01] [h01]",xs:string(fn:doc($uris)//j:dikwmetadata//j:timestamp))) < $today_minus_x)
:)

Но для этого нужны элементы... нет, я застрял.

Вопросы: есть ли более простой способ найти и пересчитать все документы старше x дней?

1 ответ

Решение

Одна из проблем с вашим текущим кодом заключается в том, что вы анализируете даты во время выполнения. Это всегда будет медленно, потому что ему нужен доступ к самому XML.

Это будет работать лучше всего, если ваш элемент j:timestamp будет содержать строку, соответствующую xs:date или xs:dateTime. Затем вы можете объявить индекс диапазона (path) для этого элемента типа date/dateTime (независимо от того, что вам больше подходит).

Альтернативой является создание чего-то вроде атрибута iso-date(Time) для этого элемента, содержащего предварительно обработанную дату типа xs:date(Time), чтобы вы могли индексировать ее.

Получив индекс диапазона, вы можете выполнить (path-)range-query для вашего элемента. Затем вы можете также использовать cts:uris, чтобы получить документы, которые нужно удалить.

НТН!

Другие вопросы по тегам