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

时间:2018-08-29 12:00:48

标签: xquery marklogic

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

示例文档-

<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并获取最后一个值。

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:2)

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

对于序号的特定情况,还有更多内容。并行摄取时,如何保证线程之间的唯一性?这不是一个简单的问题,因此出于性能原因,我们通常建议不要使用序列号。请改用随机数。它实际上使冲突成为不可能,并阻止争用来得出max +1 ID。

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

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

HTH!