使用CTS的MarkLogic计数旧文档:通过Flwor搜索



有关使用CTS的问题:通过FlowR搜索。我有一个XQY,可以在数据库中的所有文档上运行,并检查具有时间戳的元素。我们创建了有关DOC插入的时间戳。目标是删除比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天更老的文档?

当前代码的问题之一是您在运行时解析日期。这总是会很慢,因为它需要访问XML本身。

,如果您的J:TIMESTAMP元素包含匹配XS的字符串:日期或XS:DateTime,这将最有效。然后,您可以在类型日期/dateTime的该元素上声明(路径)范围索引(无论您最适合您)。

替代方案是在该元素上创建类似于iSo-date(time)属性的内容,该元素包含XS类型的预先日期:date(time),因此您可以索引一个。

有一个范围索引后,您可以在元素上进行(路径 - )范围。然后,您也可以使用CTS:uris获取需要删除的文档。

hth!

最新更新