从 Couchbase N1Q1 查询返回的数组中获取最小值和最大值

Get minimum and maximum value from a Array returned from a Couchbase N1Q1 query

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

查询 return 文档键列表:

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 个查询才能获得最小最大值。

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

使用 CTE,或让 6.5.0 之前的版本

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;

为什么不是这样的查询?

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

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

但我认为您将 运行 以任何方式进入另一个问题:词典顺序。 Couchbase 文档键是字符串。例如。 “order:100”在字母表中位于“order:2”之前。所以你要么需要用前导零制作你的键(例如“order:00002”而不是“order:2”),或者你需要将键解析为一个数字并按它排序(例如使用TONUMBER, REGEXP_*, 等)