我想从数据库中存在的所有文档中获取<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
并获取最后一个值。
答案 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!