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

Xquery 从多个集合中搜索最新文档,xquery,marklogic,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(),",",$lat

共有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
    
期望

456712018-04-05T11:28:47.722Z

12342018-04-05T11:28:47.040Z

我认为@wst在您前面的问题中给出的答案(仅涉及一个集合)(请参阅)也适用于多个集合。这主要是因为括号的位置不同。此外,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())

重新阅读问题(添加的预期部分有所帮助,谢谢),我发现我可能误解了预期的输出。您不是在所有匹配集合中查找最新的结果,而是希望每个集合的最新结果按降序显示。那看起来有点不同,而且你离得也不远。您只需要第二个ORDERBY子句:

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利用该索引快速查找升序或降序中的第一个。最清晰的方法是使用参数。比如:

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())


我认为@wst在您前面的问题中给出的关于一个集合的答案(请参阅)也可以适用于多个集合。这主要是因为括号的位置不同。此外,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())

重新阅读问题(添加的预期部分有所帮助,谢谢),我发现我可能误解了预期的输出。您不是在所有匹配集合中查找最新的结果,而是希望每个集合的最新结果按降序显示。那看起来有点不同,而且你离得也不远。您只需要第二个ORDERBY子句:

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利用该索引快速查找升序或降序中的第一个。最清晰的方法是使用参数。比如:

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())


第一个解决方案为45672018-04-05T11:28:47.722Z,我希望最终输出为
45672018-04-05T11:28:47.722Z 12342018-04-05T11:28:47.040Z
我对Geert的“第二个”解决方案给出了+1作为起点。您对FLWOR语句所做的任何操作(排序/筛选)都将无法很好地扩展。范围索引选项是ML和cts库的完美使用。此外,即使出于某种目的我需要uri、时间戳和集合的列表,我也会将cts:co-occurrence用于其他用途。re“您对FLWOR语句(排序/筛选)所做的任何操作都不会进行扩展。”,我不同意将“任何事情”作为一般性语句。MLXQuery编译器和运行时在许多情况下都会对索引的使用进行优化,如果不能,则会退回到非索引使用。最大的问题是,这种情况何时发生或做出了什么选择并不明显。对于非专家,我建议从基本的FLWOR表达式和简单的Xquery开始,直到功能正确为止,然后使用Xquery探查器帮助优化“热点”功能。第一个解决方案caters给出45672018-04-05T11:28:47.722Z,我希望最终输出为
45672018-04-05T11:28:47.722Z 1234,2018-04-05T11:28:47.040Z
我对Geert的“第二个”解决方案给出了+1作为起点。您对FLWOR语句所做的任何操作(排序/筛选)都将无法很好地扩展。范围索引选项是ML和cts库的完美使用。此外,即使出于某种目的我需要uri、时间戳和集合的列表,我也会将cts:co-occurrence用于其他用途。re“您对FLWOR语句(排序/筛选)所做的任何操作都不会进行扩展。”,我不同意将“任何事情”作为一般性语句。MLXQuery编译器和运行时在许多情况下都会对索引的使用进行优化,如果不能,则会退回到非索引使用。最大的问题是,这种情况何时发生或做出了什么选择并不明显。对于非专家,我建议从基本的FLWOR表达式和简单的Xquery开始,直到功能正确为止,然后使用Xquery分析器帮助优化“热点”功能。