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
这有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 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默认为升序;必须使用选项指定降序。请参阅文档: