我是从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(" xquery version "1.0-ml"; (: 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)))
有什么建议吗?
答案 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!