2014-02-03 3 views
2

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

Теперь мне нужно знать, сколько у меня документов, которые старше, чем х дней, поэтому я могу попробовать работу 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 работа работает каждый день.

Я смотрел в КТС: поиск что-то вроде:

(: 
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) 
:) 

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

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

ответ

2

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

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

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

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

HTH!

+0

thx для вашего ответа, не уверен, могу ли я использовать этот элемент метки непосредственно так, как вы описываете? ' 2014-02-03 21: 16: 05.348159' –

+0

, если я делаю 'let $ d2: = xs: dateTime (fn: doc ($ uri) // j: dikwmetadata // j : timestamp) 'i get' XDMP-CAST: (err: FORG0001) xs: dateTime (fn: doc ($ uri)/descendant :: j: dikwmetadata/descendant :: j: timestamp) - Недопустимый листинг: xs: untypedAtomic («2014-02-03 21: 15: 35.036983»), отлитый как xs: dateTime в строке 17 expr: xs: dateTime (fn: doc ($ uri)/descendant :: j: dikwmetadata/descendant :: j: timestamp) '... поэтому я думаю, мне нужно сначала манипулировать документами, чтобы совместить строку timestamp? –

+0

ah ok Я узнал, что эта метка времени была создана скриптом python для вставки документа ... так что другая метка времени в другом элементе доступна напрямую. необходимо изменить код python, чтобы он помещал временную метку в формат ML. спасибо! –

Смежные вопросы