MarkLogic XQUERY - 如何按集合和日期搜索文档?

时间:2017-05-04 22:13:44

标签: marklogic

我是从MarkLogic开始的,我想知道如何使用xquery从Marklogic获取文档json。我有下一个xquery:

xquery version "1.0-ml";
(: Parameter of Input :)
declare variable $ruc as xs:string external;
declare variable $startDate as xs:string external;
declare variable $endDate as xs:string external;

declare function local:findDocumentsByColletion($ruc as xs:string) {
  for $i in cts:search(fn:doc(),
    cts:and-query((cts:collection-query("TRANSACTION"), 
                 cts:collection-query($ruc))))
  return $i
};
for $doc in local:findDocumentsByColletion ($ruc)
return $doc

只有按集合获取文档,但我不知道如何使用startDate和endDate作为搜索文档的参数按日期搜索。

我尝试使用此示例https://docs.marklogic.com/guide/search-dev/rangequery,但它有所不同,因为搜索只是在一个文档xml上。

我按日期搜索的功能如下:

declare function local:findDocumentsByDate($startDate as xs:string, $endDate as xs:string) {
  for $doc in local:findDocumentsByColletion ($ruc)
    cts:search($doc/Authorization,
    cts:element-range-query(xs:QName("Timestamp"), ">=", xs:date($startDate)),
    cts:element-range-query(xs:QName("Timestamp"), "<=", xs:date($endDate)))
  return $doc
}

但它不起作用:

[1.0-ml] XDMP-UNEXPECTED: (err:XPST0003) Unexpected token syntax error, unexpected QName_
Stack Trace

At line 18 column 4:
In xdmp:eval("&#10;xquery version &quot;1.0-ml&quot;;&#10;(: Parameter of Inpu...", (), <options xmlns="xdmp:eval"><database>4000066727531963679</database>...</options>)
16. declare function local:findDocumentsByDate($startDate as xs:string, $endDate as xs:string) {
17. for $doc in local:findDocumentsByColletion ($ruc)
18. cts:search($doc/Authorization,
19. cts:element-range-query(xs:QName("Timestamp"), ">=", xs:date($startDate)),
20. cts:element-range-query(xs:QName("Timestamp"), "<=", xs:date($endDate)))

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我喜欢创建可重用函数的想法,这些函数可以组合以查找您要搜索的结果。但是,你不能以你的方式包装搜索,也不能保持高效。

我建议创建提供总查询部分内容的功能,而不是进行多次搜索。您将这些组成一个大型查询,并使用一个cts:search执行该查询。类似的东西:

declare function local:findDocumentsByColletion($ruc as xs:string) {
  cts:and-query((
    cts:collection-query("TRANSACTION"), 
    cts:collection-query($ruc)
  ))
};

declare function local:findDocumentsByDate($startDate as xs:string, $endDate as xs:string) {
  cts:and-query((
    cts:element-range-query(xs:QName("Timestamp"), ">=", xs:date($startDate)),
    cts:element-range-query(xs:QName("Timestamp"), "<=", xs:date($endDate))
  ))
};

cts:search(collection()/Authorization, cts:and-query((
  local:findDocumentsByCollection($ruc),
  local:findDocumentsByDate($startDate, $endDate)
)))

HTH!