从多个集合中搜索最新文档

时间:2018-04-05 18:08:42

标签: xquery marklogic

有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

1 个答案:

答案 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!