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

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

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

样本文件 -

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

我的数据库拥有超过100万条记录,我想获取其中具有最大价值的ID。

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

我需要使用该值来创建一个INCREMENTAL COUNTER(最大值将成为我对COUNTER的第一个值)。

是否有任何建议以有效的方式获取该值?因为我不能做超过100万条记录的cts:search(),然后做orderby ascending并获取最后一个值。

xquery marklogic
2个回答
3
投票

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

例:

(: 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]

2
投票

当你需要获得包含日期,价格,数量或其他类型价值的元素的最大值或其他集合时,以利亚的答案就足够了。

对于序列号的具体情况,还有更多内容。如何在并行摄取时保证线程间的唯一性?这是一个非常重要的问题,出于性能原因,我们通常建议不要使用序列号。请改用随机数字。它使碰撞几乎不可能,并防止争用导出max + 1 ID。

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

https://github.com/grtjn/ml-unique#how-it-works

HTH!

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