【问题标题】:Get minimum and maximum value from a Array returned from a Couchbase N1Q1 query从 Couchbase N1Q1 查询返回的数组中获取最小值和最大值
【发布时间】:2021-03-06 22:31:07
【问题描述】:

我有一个返回一组有序文档键的查询。我需要从这个返回的数组中找到最小和最大键。

查询以返回文档键列表:

SELECT RAW META(d).id
FROM `orders` AS d
WHERE META(d).id LIKE 'order:%'
ORDER BY META().id LIMIT 5

输出:

[
    order:1,
    order:2,
    order:3,
    order:4,
    order:5
]

我需要从数组中获取最小值,所以我使用以下查询:

SELECT RAW ARRAY_MIN(
    SELECT RAW META(d).id
    FROM `orders` AS d
    WHERE META(d).id LIKE 'order:%'
    ORDER BY META().id LIMIT 5)
)

为了获得最大值,我在上述查询中使用了 ARRAY_MAX 函数。

如您所见,我必须触发 2 个查询才能获得最小最大值。

问题:有没有一种方法可以在单个查询中从文档键数组中获取最小值和最大值?

【问题讨论】:

    标签: couchbase n1ql


    【解决方案1】:

    使用 CTE,或 6.5.0 之前的 LET

    WITH aval AS (SELECT RAW META(d).id
                  FROM `orders` AS d
                  WHERE META(d).id LIKE 'order:%'
                  ORDER BY META().id LIMIT 5)
    SELECT ARRAY_MIN(aval) AS min, ARRAY_MAX(aval) AS max;
    

    您也可以使用以下内容,因为您的数组元素已排序。

    WITH aval AS (SELECT RAW META(d).id
                  FROM `orders` AS d
                  WHERE META(d).id LIKE 'order:%'
                  ORDER BY META().id LIMIT 5)
    SELECT aval[0] AS min, aval[-1] AS max;
    

    【讨论】:

    • 工作就像一个魅力。谢谢!
    • 原来 With 子句仅在 Couchbase 6.5 中可用,我们在 prod 中使用 5.5 :-(。还有其他方法可以做到这一点。我想将 couchbase 键集分成页面。获取页面我需要每个页面的开始和结束索引,我需要每个页面的最小最大值。
    【解决方案2】:

    为什么不用这样的查询?

    SELECT MIN(META().id) AS min, MAX(META().id) AS max
    FROM orders;
    

    您不能在此查询中使用 RAW,但如有必要,您可以解决此问题。

    但我认为,无论以何种方式,您都会遇到另一个问题:字典顺序。 Couchbase 文档键是字符串。例如。 “order:100”在字母表中位于“order:2”之前。所以你要么需要用前导零制作你的键(例如“order:00002”而不是“order:2”),或者你需要将键解析为一个数字并按其排序(例如使用@ 987654323@、REGEXP_*等)

    【讨论】:

    • 感谢您指出“字典顺序”,它将在未来帮助我。然而,对于这个特定的用例,它们如何排序并不重要,因为它们始终以相同的顺序排序。
    猜你喜欢
    • 2022-11-25
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    相关资源
    最近更新 更多