cts:value-匹配 Marklogic 中的 xs:dateTime() 类型

cts:value-match on xs:dateTime() type in Marklogic

我有一个变量$yearMonth := "2015-02" 我必须在元素 Date as xs:dateTime 上搜索此日期。 我想使用正则表达式查找所有具有此日期“2015-02-??”的 files/documents 我在 ModifiedInfo/Date 上启用了 path-range-index 我正在使用以下代码,但收到 Invalid cast 错误

let $result := cts:value-match(cts:path-reference("ModifiedInfo/Date"), xs:dateTime("2015-02-??T??:??:??.????"))

我也使用了下面的代码并得到了同样的错误

let $result := cts:value-match(cts:path-reference("ModifiedInfo/Date"), xs:dateTime(xs:date("2015-02-??"),xs:time("??:??:??.????")))

请帮忙:)

您似乎正尝试对数据类型为 xs:dateTime() 的路径范围索引使用通配符搜索。

但是,目前 MarkLogic 不支持此功能。有多种方法可以处理这种情况:

  1. 您可以创建字段索引。
  2. 您可以将其更改为支持通配符搜索的字符串索引。
  3. 您可以运行此解决方法来支持您现有的系统:

    for $x in cts:values(cts:path-reference("ModifiedInfo/Date")) return if(starts-with(xs:string($x), '2015-02')) 然后 $x else ()

此查询将从词典中提取值,然后您可以过滤所需的日期。

您还可以考虑使用 cts:query 参数来执行 cts:values 以搜索 2015-02-01 和 2015-03-01 之间的值。不过请注意,如果一个文档中出现多个日期,您毕竟需要 post 手动过滤(就像 Navin 的选项 3),但它可能会大大加快 post 过滤速度。

HTH!

您可以通过将几个 cts:element-range-querys 组合在一个 and-query 中来解决这个问题:

let $target := "2015-02"
let $low := xs:date($target || "-01")
let $high := $low + xs:yearMonthDuration("P1M")
return
  cts:search(
    fn:doc(),
    cts:and-query((
        cts:element-range-query("country", ">=", $low),
        cts:element-range-query("country", "<",  $high)
      ))
  )

来自cts:element-range-query documentation

If you want to constrain on a range of values, you can combine multiple cts:element-range-query constructors together with cts:and-query or any of the other composable cts:query constructors, as in the last part of the example below.