繁体   English   中英

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

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

我有一个变量$yearMonth := "2015-02"我必须在元素Date as xs:dateTime上将此日期搜索Date as xs:dateTime 我想使用正则表达式查找日期为“ 2015-02- ??”的所有文件/文档。 我在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”))返回if(starts-with(xs:string($ x),'2015-02'))然后$ x else()

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

您可以通过在and-query中结合几个cts:element-range-querys来解决此问题:

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文档中

如果要限制值的范围,可以将多个cts:element-range-query构造函数与cts:and-query或其他任何可组合的cts:query构造函数组合在一起,如下面示例的最后一部分。

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

HTH!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM