【问题标题】:Delete documents less than 30 days in Marklogic Xquery在 Marklogic Xquery 中删除少于 30 天的文档
【发布时间】:2021-06-08 17:48:02
【问题描述】:

我有一个日期时间字段,我必须删除不到 30 天的文档。如何在 xquery 中实现 比如 datetimefield

【问题讨论】:

  • 你试过什么?有几个基本的 XQuery 函数支持日期/持续时间比较和计算,请参阅 datypic.com/books/xquery/chapter20.html
  • 我认为它是一个 javascript。对于例如 30 天的日子,我在 xquery 中看不到任何命令。有错请指正
  • 该字段是否使用范围索引(日期时间或字符串)进行索引?
  • 您的问题被标记为 xquery。您是否正在寻找 JavaScript 或 XQuery 解决方案(您可以在 MarkLogic 中执行其中一个/两个)。
  • xquery @MadsHansen

标签: xquery marklogic


【解决方案1】:

在搜索日期时间范围时,范围索引将是最好/最快的。

使用 dateTime 元素范围索引,您可以执行以下操作:

let $thirtyDaysAgo := current-dateTime() - xs:dayTimeDuration("P30D")
return
  cts:search(doc(), 
    cts:and-query((
      cts:element-range-query(xs:QName("myDateTimeField"), ">", $thirtyDaysAgo),
      cts:element-range-query(xs:QName("myDateTimeField"), "<", current-dateTime())
    ))

如果您没有范围索引,那么您可以搜索包含该字段的文档并将谓词过滤器应用于搜索结果(希望尽可能缩小候选者的数量,甚至可能寻找几年以及将作为该字段中的单词包含在该日期范围内的月份)

cts:search(doc(), 
  cts:element-query(xs:QName("myDateTimeField"), cts:true-query())
)[.//myDateTimeField[xs:dateTime(.) gt $thirtyDaysAgo and xs:dateTime(.) lt current-dateTime()]]

但是,如果从搜索中返回大量候选对象,则使用谓词进行过滤可能会很慢。使用更具体的 XPath 来定位该元素而不是 // 后代轴也可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多