Xquery 使用marklogic中的cts:collection match限制结果
我有两个系列Xquery 使用marklogic中的cts:collection match限制结果,xquery,marklogic,Xquery,Marklogic,我有两个系列 /测试/1 这有10个id为的文档 test1_1 test1_2 ..... test1_10 /测试/2 这有20个id为的文档,如下所示 test2_1 test2_2 ..... test2_20 查询: let $result := cts:collection-match("/test/*") let $id :=( fn:distinct-values( for $doc in fn:collection(result) order b
- /测试/1
test1_1
test1_2
.....
test1_10
- /测试/2
test2_1
test2_2
.....
test2_20
查询:
let $result := cts:collection-match("/test/*")
let $id :=(
fn:distinct-values(
for $doc in fn:collection(result)
order by $doc//timestamp descending
return $doc//timestamp/text()
)[1 to 5]
)
return $id
我想按时间戳的降序返回每个集合的前5个文档,但当
$result
是一个大于一项的序列时,它只返回5个文档,而不是10个,即每个集合的前5个文档,在fn:collection($result)中为$doc写入
将多个集合中的所有文档聚合到一个序列中。您需要首先迭代集合,然后迭代每个集合中的值(有序和有限)
let $collections := cts:collection-match("/test/*")
let $id :=
for $collection in $collections
return
fn:distinct-values(
for $doc in fn:collection($collection)
order by $doc//timestamp descending
return $doc//timestamp/string()
)[1 to 5]
return $id
可以工作,但有没有其他方法可以避免在查询中使用2。@coder25没有任何实质性的影响。您需要内部的
,以便使用“order by”,并且要为每个集合获取单独的结果集,您需要为每个集合执行一次该查询。@coder25我能想到的唯一替代方法是在时间戳上创建一个范围索引,并使用cts:search
和cts:index order
选项(参考时间戳
索引)。这会将内部for
循环减少为对cts:search
的函数调用;但是,在后台,它仍在迭代。我尝试使用索引顺序,但结果没有按降序排序order@coder25默认为升序;必须使用选项指定降序。请参阅文档: