如何使用MarkLogic中的cts:值获取元素的最大值?

问题描述 投票:0回答:2

我想从数据库中存在的所有文档中获取<ID>的最大值。

样本文件 -

<root xmlns="http://marklogic.com/sample">
 <node>
  <ID>3253523</ID>
  <value1>.....</value1>
  <value2>.....</value2>
  <value3>.....</value3>
  <value4>.....</value4>
   .....................
 </node>
</root>

我尝试的方法如下 -

  1. 我用uri http://marklogic.com/sample创建了一个前缀为sa的路径命名空间。
  2. 创建类型为int的路径范围索引,路径为/sa:root/sa:node/sa:ID

3.尝试使用以下代码从数据库中获取最大值 -

declare namespace sa = "http://marklogic.com/sample"; (cts:values(cts:path-reference('/sa:root/sa:node/sa:ID'), (), "descending"))[1]

但这给了我一个空的序列。不知道我在这里缺少什么。

有什么建议 ??

xquery marklogic
2个回答
2
投票

尝试将带有命名空间绑定的映射作为cts:path-reference()的第三个参数传递。见:http://docs.marklogic.com/cts:path-reference

顺便说一下,cts:max()可能是从范围索引中获得最大值的最有效方法。见:http://docs.marklogic.com/cts:max

该方法类似于以下片段:

cts:max(
    cts:path-reference('/sa:root/sa:node/sa:ID', (),
        map:entry("sa", "http://marklogic.com/sample")
    ))

希望有所帮助,


1
投票

正如Elijah Bernstein-Cooper所建议的那样,我刚刚在你共享的xml中添加了xmlns="http://marklogic.com/sample"命名空间,并在db中插入了几个xml文件。

创建路径命名空间,路径范围索引并运行共享cts查询,它完美地工作,所以Elijah是正确的,你只需要在xml中指定命名空间。

您的查询中的小变化是在declare namespace语句中,前缀将是sa而不是es

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.