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

从Couchbase N1Q1查询返回的数组中获取最小值和最大值,couchbase,n1ql,Couchbase,N1ql,我有一个返回一组有序文档键的查询。我需要从返回的数组中找到最小和最大密钥 查询以返回文档键列表: 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 ] 我需要从数组中获取最小值,因此我使用以下查询: SEL

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

查询以返回文档键列表:

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;

使用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文档键是字符串。例如,在字母表中,“订单:100”排在“订单:2”之前。因此,您要么需要使用前导零来生成密钥(例如,“order:00002”而不是“order:2”),要么需要将密钥解析为一个数字并按该数字排序(例如使用
TONUMBER
REGEXP.*
等)

为什么不使用这样的查询

SELECT MIN(META().id) AS min, MAX(META().id) AS max
FROM orders;
您不能在此查询中使用
RAW
,但如有必要,您可以解决此问题


但我认为不管你怎么做,你都会遇到另一个问题:词典排序。Couchbase文档键是字符串。例如,在字母表中,“订单:100”排在“订单:2”之前。因此,您需要使用前导零来生成密钥(例如,“order:00002”而不是“order:2”),或者您需要将密钥解析为一个数字并按该数字排序(例如使用
TONUMBER
REGEXP.*
等)

非常有效。谢谢事实证明,With子句仅在Couchbase 6.5中可用,我们在prod中使用5.5:-(.还有其他方法吗?我想把couchbase键集分成几页。要得到一个页面,我需要每个页面的开始和结束索引,我需要每个页面的最小最大值。工作起来很有魅力。谢谢!原来With子句只在couchbase 6.5中可用,我们在prod中使用5.5:-(.是否有其他方法可以做到这一点。我想将couchbase键集划分为多个页面。要获得一个页面,我需要每个页面的开始索引和结束索引,我需要每个页面的最小-最大索引。感谢您指出“词典排序”,这将在将来对我有所帮助。但是对于这个特定的用例,它们如何排序对我来说并不重要正如它们在相同的顺序中被一致地排序一样。感谢您指出“词典排序”,这将在将来对我有所帮助。但是对于这个特定的用例,它们如何在相同的顺序中被一致地排序对我来说并不重要。