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

MarkLogic XQUERY-如何按集合和日期搜索文档?,marklogic,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 exte

我从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作为搜索文档的参数按日期进行搜索

我尝试过这个例子,但它不同,因为搜索只针对一个文档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
}
声明函数local:findDocumentsByDate($startDate为xs:string,$endDate为xs:string){
对于本地$doc:FindDocumentsByCollection($ruc)
cts:搜索($doc/授权,
cts:元素范围查询(xs:QName(“时间戳”),“>=”,xs:date($startDate)),
cts:元素范围查询(xs:QName(“时间戳”),“=”,xs:date($startDate)),

20.cts:element-range-query(xs:QName(“Timestamp”),“您就快到了。因为您希望两个范围条件都保持不变,所以需要将它们包装在cts:and-query中:

cts:search($doc/Authorization,
   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($doc/授权、,
cts:和查询((
cts:元素范围查询(xs:QName(“时间戳”),“>=”,xs:date($startDate)),

cts:element-range-query(xs:QName(“Timestamp”),“我喜欢创建可重用函数的想法,这些函数可以组合起来查找您正在搜索的结果。但是,您不能以您这样的方式包装搜索,这也不会有性能

我建议您创建一些函数来提供整个查询的一部分,而不是进行多个搜索。您可以将这些函数组合成一个大查询,然后只使用一个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)
)))
声明函数local:findDocumentsByColletion($ruc as xs:string){
cts:和查询((
cts:收款查询(“交易”),
cts:集合查询($ruc)
))
};
声明函数local:findDocumentsByDate($startDate为xs:string,$endDate为xs:string){
cts:和查询((
cts:元素范围查询(xs:QName(“时间戳”),“>=”,xs:date($startDate)),

cts:element range query(xs:QName(“Timestamp”),“我希望这个cts:search会失败,因为
$doc/Authorization
是一个不可搜索的路径。TY,你能帮我解决这个错误吗?[1.0-ml]XDMP-ELEMRIDXNOTFOUND:cts:search(fn:collection()/Authorization,cts:and query((cts:collection query(“TRANSACTION”),cts:collection query(“2055109035”),cts:元素范围查询(fn:QName(“,“时间戳”),“>=”,xs:date(“2017-05-04”),(),1),…,())--没有时间戳的日期元素范围索引确保为没有命名空间的元素定义了类型为
date
的元素范围索引,以及本地名称
Timestamp
。我确实有一个用于搜索的json文档,它有一个恶魔“Timestamp”:“2017-05-04T14:14-10Z"我想按日期筛选这些文档。我认为日期的mi查询是错误的,我怎么能进行mi查询?数据中有值很重要,但为了使用不等查询,需要使用范围查询,这依赖于有关范围索引的详细信息,请参阅《管理指南》:
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)
)))