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”更改为空序列