zrangebyscore

1. 基本語法

zrangebyscore(key, min:<number|string>, max:<number|string>, ['WITHSCORES'], ['LIMIT', offset, count], callback)

於有序集合中,篩選分數範圍介在minmax之間的成員,根據分數「由小到大」回傳成員名單(這點與zrevrangebyscore相反)。可再透過WITHSCORES參數同時回傳成員及分數;或根據LIMIT參數,透過偏移位置offset與數量count篩選區間成員。

特殊字串

適用參數

功能

-Inf

min

對應分數為負無限小

Inf 或 +inf

max

對應分數為正無限大

(

minmax

預設分數區間包含邊界值(閉集合); 加「 ( 」則區間將不包含邊界值(開集合)

2. 範例

(1) 創建一組分數不完全相同的有序集合

client.del('zset:1');

const key1 = 'zset:1'
const members1 = ['c', 'a', 'C', 'A', 'B', 'b'];
const scores1 = [-2, -1, 0, 0, 1, 2];

members1.forEach((mem, ind) => {
    client.zadd(key1, scores1[ind], mem);
})

client.zrange(key1, 0, -1, 'WITHSCORES', (err, obj) =>{
    console.log(key1, ':', obj);
});
zset:1 : ['c', '-2', 'a', '-1', 'A', '0', 'C', '0', 'B', '1', 'b', '2']

(2) 篩選分數範圍:分數大於等於0以上的所有成員

不需要知道成員分數的最大值/最小值,可直接透過-inf/+inf特殊字串替代。

client.zrangebyscore(key1, 0, 'inf', (err, obj) =>{
    console.log(key1, ':', obj);
});

成員

c

a

A

C

B

b

分數

-2

-1

0

0

1

2

zset:1 : [ 'A', 'C', 'B', 'b' ]

(3) 透過LIMIT參數進一步擷取區間成員:

client.zrangebyscore(key1, '(-1', '2', 'LIMIT', 1, 2, (err, obj) =>{
    console.log(key1, ':', obj);
});

成員

c

a

A

C

B

b

分數

-2

-1

0

0

1

2

(-1, 2]

x

x

o

o

o

o

offset = 1

x

x

0

1

2

3

count = 2

x

x

-

o

o

-

zset:1 : [ 'C', 'B' ]

Last updated

Was this helpful?