如果某些文档包含空值元素,请在日期字段上使用element-range-query进行搜索

时间:2019-01-16 10:12:19

标签: marklogic marklogic-9 cts-search

我在modificationDateTime元素上创建了一个element-range-index。

我们的xml是这样的:

<data>
  <id>456789</id>
  <modificationDateTime>2018-10-15T15:16:37.047Z</modificationDateTime>
  <otherElementsFollow> ... </otherElementsFollow>
</data>

我正在使用以下查询来获取15th Oct 2018甚至15至16日范围内的文档:

cts:search(/, (
    cts:and-query((
       cts:directory-query("/my-directory/", "1")
       , cts:element-range-query(xs:QName("modificationDateTime"), ">=", xs:dateTime("2018-10-15T00:00:00.000+05:30"))
       , cts:element-range-query(xs:QName("modificationDateTime"), "<=", xs:dateTime("2018-10-15T23:59:59.000+05:30"))
    ))
)

运行查询时出现以下错误:

[1.0-ml] XDMP-CAST: (err:FORG0001) cts:search(fn:collection(), cts:and-query((cts:directory-query("/my-directory/", "1"), cts:element-range-query(xs:QName("modificationDateTime"), ">=", xs:dateTime("2018-10-15T00:00:00+05:30"), (), 1), cts:element-range-query(xs:QName("modificationDateTime"), "<=", xs:dateTime("2018-10-15T23:59:59+05:30"), (), 1)), ())) -- Invalid cast: "" cast as xs:dateTime

经过分析,我发现有些XML的<modificationDateTime>元素值为空,例如:

<data>
  <id>1234567</id>
  <modificationDateTime></modificationDateTime>
  <otherElementsFollow> ... </otherElementsFollow>
</data>

这就是导致此问题的原因,我们不能删除此元素,也不能拥有一些值,因为empty是有效值。

关于如何在空元素上使用范围索引进行搜索的任何帮助,理想情况下,它应该考虑这些记录,但是当我将空值更新为有效的dateTime值时,同一查询可以正常工作。

1 个答案:

答案 0 :(得分:2)

如果排除具有这些空元素的文档是一种选择,则可以将此not-query附加到and-query上:

cts:not-query(
  cts:element-value-query(xs:QName("modificationDateTime"), "")
)

HTH!