【问题标题】:return latest document based on a element in marklogic根据 marklogic 中的元素返回最新文档
【发布时间】:2018-04-05 17:15:08
【问题描述】:

有一个包含 4 个文档的集合。我想检索具有最新时间戳的文档。

以下查询有助于按降序排序,但我想要最新修改的文​​档

 for $doc in fn:collection("/test")
 order by $doc//timestamp descending
 return $doc//id/text(),",",$doc//timestamp/text())

输出

1234, 2018-03-05T11:29:42.722Z
 5678,2018-03-05T11:29:42.715Z
 8976,2018-02-05T11:28:42.710Z
 8976,2018-02-04T11:28:42.716Z

【问题讨论】:

    标签: xquery marklogic


    【解决方案1】:

    您的 for 循环已经在生成一个序列,所以您需要做的就是获取第一项。因此,您最终不会查询不需要的文档的值,请将查询的输出呈现部分移动到单独的表达式中。

    let $latest :=
      (for $doc in fn:collection("/test")
      order by $doc//timestamp descending
      return $doc)[1]
    return $latest//id/text(),",",$latest//timestamp/text())
    

    现在,如果timestamp 上有一个xs:dateTime 类型的范围索引,您可以选择最近的文档,而无需先将所有这些文档加载到内存中并进行排序。但是,您可能必须将 $doc//timestamp 替换为 $doc/path/to/timestamp(无双斜杠),以便查询优化器自动使用范围索引。

    【讨论】:

    • 这可行,但例如如果我尝试使用 let $a := cts:collection-match("/test/*") 并且有 2 个集合 /test/123test/567 我想返回两个集合中的最新一个。上述解决方案不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 2019-03-23
    • 1970-01-01
    • 2014-01-28
    • 2018-05-17
    相关资源
    最近更新 更多