zunionstore
1. 基本語法
zunionstore(destination
, numkeys
, key[, key, ...]
, ["WEIGHTS", weight[, weight, ...]
, ["AGGREGATE", SUM|MIN|MAX]
)
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.zunionstore('zset:union', 2, key1, key2);
client.zrange('zset:union', 0, -1, 'WITHSCORES', (err, obj) =>{
console.log('Union : ', obj);
});
member
key1
key2
SUM
...
...
...
...
C
5
0
5
D
7
2
9
...
...
...
...
Union : [
'A', '1', 'B', '3',
'E', '4', 'C', '5',
'F', '6', 'G', '8',
'D', '9'
]
(3) 若有交集,則交集成員分數改以「加權分數」計算
client.zunionstore('zset:union', 2, key1, key2, 'WEIGHTS', 1, 10);
client.zrange('zset:union', 0, -1, 'WITHSCORES', (err, obj) =>{
console.log('Union : ', obj);
});
member
key1 * weight1
key2 * weight2
Weighted SUM
...
...
...
...
C
5 * 1 = 5
0 * 10 = 0
5
D
7 * 1 = 7
2 * 10 = 20
27
...
...
...
...
Union : [
'A', '1', 'B', '3',
'C', '5', 'D', '27',
'E', '40', 'F', '60',
'G', '80'
]
(4) 若有交集,則交集成員分數改以「最小值」計算
client.zunionstore('zset:union', 2, key1, key2, 'AGGREGATE','MIN');
client.zrange('zset:union', 0, -1, 'WITHSCORES', (err, obj) =>{
console.log('Union : ', obj);
});
member
key1
key2
MIN
...
...
...
...
C
5
0
0
D
7
2
2
...
...
...
..
Union : [
'C', '0', 'A', '1',
'D', '2', 'B', '3',
'E', '4', 'F', '6',
'G', '8'
]
Last updated
Was this helpful?