Xquery 如何在Marklogic中从整个数据库中获取元素的最大值?

Xquery 如何在Marklogic中从整个数据库中获取元素的最大值?,xquery,marklogic,Xquery,Marklogic,我想从数据库中存在的所有文档中获取的最大值 样本文件- <root> <ID>3253523</ID> <value1>.....</value1> <value2>.....</value2> <value3>.....</value3> <value4>.....</value4> .....................

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

样本文件-

<root>
   <ID>3253523</ID>
   <value1>.....</value1>
   <value2>.....</value2>
   <value3>.....</value3>
   <value4>.....</value4>
    .....................
</root>

3253523
.....
.....
.....
.....
.....................
我的数据库有超过100万条记录,我想获取最有价值的ID

我不能使用
fn:last()
,因为它不会给我最大值

我需要使用该值创建一个增量计数器(最大值将成为计数器的第一个值)


有什么建议可以有效地获取该值吗?因为我无法对100万条记录执行
cts:search()
,然后按升序执行
orderby singress
并获取最后一个值。

您可以向
ID
元素添加元素范围索引,然后使用该函数以降序检索第一个索引值

例如:

(: assuming a path range index for an int scalar at path '/root/ID' :)
for $i in 1 to 100
  let $doc := <root><ID>{$i}</ID></root>
  return
    xdmp:document-insert("/test/doc-" || $i, $doc, (), "test");

(cts:values(cts:path-reference("/root/ID"), (), "descending"))[1]
(:假设路径'/root/ID'处的int标量的路径范围索引:)
一美元到一百美元
让$doc:={$i}
返回
xdmp:文档插入(“/test/doc-”||$i,$doc,(),“test”);
(cts:值(cts:路径引用(“/root/ID”),(),“降序”)[1]

您可以向
ID
元素添加元素范围索引,然后使用该函数按降序检索第一个索引值

例如:

(: assuming a path range index for an int scalar at path '/root/ID' :)
for $i in 1 to 100
  let $doc := <root><ID>{$i}</ID></root>
  return
    xdmp:document-insert("/test/doc-" || $i, $doc, (), "test");

(cts:values(cts:path-reference("/root/ID"), (), "descending"))[1]
(:假设路径'/root/ID'处的int标量的路径范围索引:)
一美元到一百美元
让$doc:={$i}
返回
xdmp:文档插入(“/test/doc-”||$i,$doc,(),“test”);
(cts:值(cts:路径引用(“/root/ID”),(),“降序”)[1]

当您需要获取包含日期、价格、数字或其他类型值的元素的最大值或其他聚合值时,以利亚的回答就足够了

对于序列号的具体情况,还有更多的内容。当您进行并行摄取时,如何保证线程之间的唯一性?这是一个非常重要的问题,因此,出于性能原因,我们通常建议不要使用序列号。用随机数代替。它使冲突实际上不可能发生,并防止了导出max+1 ID的争用

我创建了一个库,它允许以各种方式生成唯一标识符,并详细阐述了每种方法的优缺点:


当您需要获取包含日期、价格、数字或其他类型值的元素的最大值或其他聚合值时,以利亚的回答就足够了

对于序列号的具体情况,还有更多的内容。当您进行并行摄取时,如何保证线程之间的唯一性?这是一个非常重要的问题,因此,出于性能原因,我们通常建议不要使用序列号。用随机数代替。它使冲突实际上不可能发生,并防止了导出max+1 ID的争用

我创建了一个库,它允许以各种方式生成唯一标识符,并详细阐述了每种方法的优缺点:


@grtjn--谢谢您的回复。我将详细讨论你实施的方法。要导入模块“uniq”,我应该首先从GitHub将mlpm安装到本地服务器上?可以从npm注册表安装mlpm。获取和部署ml-unique包很方便,但这不是必需的。没有编译,所以你也可以用其他工具把unique.xqy放到你的模块数据库中。明白了。非常感谢:)@grtjn——我正在尝试使用
uniq:next sequential uri
。您能告诉我如何在该函数中设置
种子
值或
初始计数器开始
值吗?不需要种子,也不需要初始计数器,它将自动从1开始..@grtjn--感谢您的回复。我将详细讨论你实施的方法。要导入模块“uniq”,我应该首先从GitHub将mlpm安装到本地服务器上?可以从npm注册表安装mlpm。获取和部署ml-unique包很方便,但这不是必需的。没有编译,所以你也可以用其他工具把unique.xqy放到你的模块数据库中。明白了。非常感谢:)@grtjn——我正在尝试使用
uniq:next sequential uri
。您能告诉我如何在该函数中设置
种子
值或
初始计数器开始
值吗?不需要种子,也不需要初始计数器,它将自动从1开始。@Elijah--感谢您的响应。我正在尝试使用类似以下内容:cts:values(cts:path引用('/root/ID'),1,“降序”)。为ID创建了一个路径范围索引。但我做的似乎有问题。你能给我同样的建议吗?@Shalini我更新了答案,加入了一个例子。也许将第二个参数从“1”改为空序列?谢谢以利亚!你举的例子对我很有用。但当我尝试用同样的方法处理我的案例时,它返回的是一个空序列。我的路径范围索引类似于/root/somevalue/somevalue/ID,它具有名称空间“example.com/somevalue”。我已经在管理页面上创建了路径名称空间,以及带有“/root/somevalue/somevalue/ID”的路径范围索引,但由于某些原因,它给了我空序列。@Shalini能否发布另一个stackoverflow问题,详细说明路径范围设置、文档结构和cts:values查询?我需要更多的细节来帮助你解决问题。@Elijah——当然我会的。Thanks@Elijah--谢谢你的回复。我正在尝试使用类似以下内容:cts:values(cts:path引用('/root/ID'),1,“降序”)。为ID创建了一个路径范围索引。但我做的似乎有问题。你能给我同样的建议吗?@Shalini我更新了答案,加入了一个例子。也许可以将第二个参数从“1”更改为空序列