Marklogic使用cts计算旧文档:搜索FLWOR

时间:2014-02-03 14:54:43

标签: marklogic date-comparison flwor cts-search

使用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 个答案:

答案 0 :(得分:2)

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

如果你的j:timestamp元素包含一个匹配xs:date或xs:dateTime的字符串,这将最有效。然后你可以在date / dateTime类型的元素上声明一个(路径)范围索引(最适合你的)。

替代方法是在该元素上创建类似iso-date(Time)属性的内容,其中包含类型为xs:date(Time)的预先准备日期,因此您可以将该索引编入索引。

获得范围索引后,可以对元素执行(路径)范围查询。然后你也可以使用cts:uris来获取需要删除的文档..

HTH!