【问题标题】:How to get the maximum value of an element from entire database in Marklogic?如何从 Marklogic 中的整个数据库中获取元素的最大值?
【发布时间】:2019-02-04 05:07:38
【问题描述】:

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

示例文档-

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

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

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

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

有什么建议可以有效地获取该值吗?因为我不能在 100 万 条记录上执行 cts:search(),然后执行 orderby ascending 并获取最后一个值。

【问题讨论】:

    标签: xquery marklogic


    【解决方案1】:

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

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

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

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

    HTH!

    【讨论】:

    • @grtjn--感谢您的回复。我将详细介绍您实施的方式。对于导入模块“uniq”,我应该先从 GitHub 将 mlpm 安装到我的本地服务器?
    • mlpm 可以从 npm 注册表安装。获取和部署 ml-unique 包可能很方便,但这不是必需的。没有编译,因此您也可以使用其他工具将 unique.xqy 放入模块数据库中。
    • 知道了。非常感谢:)
    • @grtjn-- 我正在尝试使用uniq:next-sequential-uri。你能告诉我应该如何在该函数中设置seed 值或initial counter start 值吗?
    • 不需要种子,也不需要初始计数器,它会自动从1开始..
    【解决方案2】:

    您可以向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]
    

    【讨论】:

    • @Elijah-- 感谢您的回复。我正在尝试使用类似 this-cts:values(cts:path-reference('/root/ID'),1, "descending") 的东西。为 ID 创建了路径范围索引。但我做的似乎有些不对劲。你能不能给我同样的建议。
    • @Shalini 我更新了答案以包含一个示例。也许将第二个参数从“1”更改为空序列?
    • 感谢以利亚!你给出的例子对我很有效。但是当我对我的情况进行同样的尝试时,它返回给我一个空序列。我的路径范围索引就像 /root/somevalue/somevalue/ID 并且它具有命名空间“example.com/somevalue”。我在管理页面上创建了路径命名空间以及带有“/root/somevalue/somevalue/ID”的路径范围索引,但由于某种原因,它给了我空序列。
    • @Shalini 您能否发布另一个 stackoverflow 问题,详细说明您的路径范围设置、文档结构和 cts:values 查询?我需要更多详细信息来帮助您解决问题。
    • @Elijah——我当然会这样做。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 2011-02-25
    相关资源
    最近更新 更多