Marklogic 使用 cts 计数旧文档 :search over FLWOR

标签 marklogic date-comparison flwor cts-search

关于使用 cts:search over 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:search 类似的内容:

(:
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:date 或 xs:dateTime 匹配的字符串,则此方法效果最佳。然后,您可以在日期/日期时间类型的元素上声明(路径)范围索引(无论最适合您的是什么)。

另一种方法是在该元素上创建类似 iso-date(Time) 属性的内容,其中包含 xs:date(Time) 类型的预解析日期,以便您可以为该元素建立索引。

一旦有了范围索引,您就可以对元素执行(路径)范围查询。然后您还可以使用 cts:uris 来获取需要删除的文档..

呵呵!

关于Marklogic 使用 cts 计数旧文档 :search over FLWOR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21530455/

相关文章:

marklogic - 在 MarkLogic 8 中删除/更新双时态三元组

xml - 如何使用 eXist-db 将 "stitch together"结果转换为单个 XML 文档?

if-statement - Xquery:相同的测试无论是在 switch/case 还是在 if/then/else 中都有不同的结果

marklogic - 字段范围索引为空

xquery - MarkLogic 的 "xdmp:collection-delete"是如何工作的?

java - 如何获得两个 ZonedDateTime 实例中的最大值?

sql - 几乎相同值的日期比较

php - 使用时区检查日期和时间何时过去时出现问题

xpath - xquery-如何获取数值列表中连续值之间的差异

xml - Marklogic : Multiple XML files created on document on importing a csv. 如何获取根文档URI路径?