zinterstore

1. 基本語法

zinterstore(destination, numkeys, key[, key, ...], ["WEIGHTS", weight[, weight, ...], ["AGGREGATE", SUM|MIN|MAX])

計算numkeys個有序集合的成員交集,並將交集成員新增至destination有序集合,交集成員的新分數預設為既有分數之加總SUM,可另設置每個key的加權分數weight,或另更改新分數計算方式SUM|MIN|MAX

2. 範例

(1) 先創建兩個有序集合

client.del('zset:1', 'zset:2');

const key1 = 'zset:1'
const members1 = ['A', 'B', 'C', 'D'];
const scores1 = [1, 3, 5, 7, 9];

const key2 = 'zset:2'
const members2 = ['C', 'D', 'E', 'F', 'G'];
const scores2 = [0, 2, 4, 6, 8, 10];

members1.forEach((mem, ind) => {
    client.zadd(key1, scores1[ind], mem);
})
client.zrange(key1, 0, -1, 'WITHSCORES', (err, obj) =>{
    console.log(key1, ':', obj);
});

members2.forEach((mem, ind) => {
    client.zadd(key2, scores2[ind], mem);
})
client.zrange(key2, 0, -1, 'WITHSCORES', (err, obj) =>{
    console.log(key2, ':', obj);
});
zset:1 : ['A', '1', 'B','3', 'C', '5','D', '7']

zset:2 : ['C', '0', 'D', '2', 'E', '4', 'F', '6', 'G', '8']

(2) 計算兩個有序集合的交集

client.zinterstore('zset:inter', 2, key1, key2);
client.zrange('zset:inter', 0, -1, 'WITHSCORES', (err, obj) =>{
    console.log('Intersection : ', obj);
});

member

key1

key2

SUM

C

5

0

5

D

7

2

9

Intersection :  [ 'C', '5', 'D', '9' ]

(3) 交集成員分數以「加權分數」計算

client.zinterstore('zset:inter', 2, key1, key2, 'WEIGHTS', 1, 10);
client.zrange('zset:inter', 0, -1, 'WITHSCORES', (err, obj) =>{
    console.log('Intersection : ', obj);
});

member

key1 * weight1

key2 * weight2

Weighted SUM

C

5 * 1 = 5

0 * 10 = 0

5

D

7 * 1 = 7

2 * 10 = 20

27

Intersection :  [ 'C', '5', 'D', '27' ]

(4) 交集成員分數以「最大值」計算

client.zinterstore('zset:inter', 2, key1, key2, 'AGGREGATE','MAX');
client.zrange('zset:inter', 0, -1, 'WITHSCORES', (err, obj) =>{
    console.log('Intersection : ', obj);
});

member

key1

key2

MAX

C

5

0

5

D

7

2

7

Intersection :  [ 'C', '5', 'D', '7' ]

Last updated

Was this helpful?