有2个集合/ test / 123和test / 567我想要返回最新的 两个馆藏的文件。
let $a := cts:collection-match("/test/*")
for $t in $ a
let $latest :=(
for $doc in fn:collection( $t)
order by $doc//timestamp descending
return $doc)[1]
return fn:concat($latest//id/text(),",",$latest//timestamp/text())
我想在搜索两个集合之后查询的最终输出 时间戳的降序
输出
1234, 2018-04-05T11:28:47.040Z
4567,2018-04-05T11:28:47.722Z
预期
4567,2018-04-05T11:28:47.722Z
1234, 2018-04-05T11:28:47.040Z
答案 0 :(得分:3)
我认为@wst在您之前的问题中仅仅讨论一个集合(参见https://stackoverflow.com/a/49678200/918496)的答案也可以适用于多个集合。主要是将括号放在不同的位置。此外,fn:collection也接受一个序列,因此适应早期的解决方案几乎是微不足道的:
let $latest :=(
for $doc in fn:collection(
cts:collection-match("/test/*")
)
order by $doc//timestamp descending
return $doc
)[1]
return fn:concat($latest//id/text(),",",$latest//timestamp/text())
<update>
重新阅读问题(添加的预期部分有帮助,谢谢),我看到我可能误解了所需的输出。您不是要查找所有匹配集合中的最新结果,而是希望每个集合中最新的结果按降序显示。这看起来略有不同,你根本不是很远。您只需要第二个order by子句:
let $a := cts:collection-match("/test/*")
for $t in $a
let $latest := (
for $doc in fn:collection($t)
order by $doc//timestamp descending
return $doc
)[1]
order by $latest//timestamp descending
return fn:concat($latest//id/text(),",",$latest//timestamp/text())
话虽如此,使用MarkLogic可能会有更多高效的方法。如果您的时间戳上有dateTime范围索引,则可以允许MarkLogic使用它来快速查找升序或降序中的第一个。最明智的方法是使用带有cts:search参数的cts:index-order。类似的东西:
let $a := cts:collection-match("/test/*")
for $t in $a
let $latest := cts:search(
collection(),
cts:collection-query($t),
cts:index-order(
cts:element-reference(
fn:QName("","timestamp"),
"type=dateTime"
),
"descending"
)
)[1]
order by $latest//timestamp descending
return fn:concat($latest//id/text(),",",$latest//timestamp/text())
</update>
HTH!