6
ZADD myset 1 ad1
ZADD myset 1 ad2

SET order:ad1 1
SET order:ad2 2

最初に順序集合スコアでソートし、次に順序値でソートする方法は?

4

1 に答える 1

14

(データの保存方法を変更せずに) 結果を保存する場合は、 SORTコマンドを使用できます。zset に適用できます。

例えば:

> zadd myset 1 albert
> zadd myset 1 joseph
> zadd myset 4 bertrand
> zadd myset 2 casimir
> zadd myset 3 alfred

値で並べ替えることができます:

> sort myset alpha
1) "albert"
2) "alfred"
3) "bertrand"
4) "casimir"
5) "joseph"

スコアと値で並べ替えることができます。

> zrange myset 0 -1
1) "albert"
2) "joseph"
3) "casimir"
4) "alfred"
5) "bertrand"

これらのオブジェクトに新しいプロパティを追加しましょう。

> set order:albert 5
> set order:alfred 3
> set order:casimir 1
> set order:joseph 4
> set order:bertrand 2

新しい順序プロパティで並べ替えることができます:

> sort myset by order:*
1) "casimir"
2) "bertrand"
3) "alfred"
4) "joseph"
5) "albert"

スコアとこの順序プロパティで並べ替える必要がある場合は、zset で順序プロパティを具体化するか、順序プロパティでスコアを具体化する以外に選択肢はありません。

たとえば、zset に order プロパティを追加すると、次のようになります。

> del myset
> zadd myset 1 5:albert
> zadd myset 1 4:joseph
> zadd myset 4 2:bertrand
> zadd myset 2 1:casimir
> zadd myset 3 3:alfred
> zrange myset 0 -1
1) "4:joseph"
2) "5:albert"
3) "1:casimir"
4) "3:alfred"
5) "2:bertrand"

注意: その場合、プロパティ フィールドは辞書式の順序に従ってソートされるため、数値の順序と複数の桁が必要な場合は、値を正規化する必要がある場合があります。これを行うには、さまざまなトリックがあります。たとえば、「1」、「12」、または「123」を格納する代わりに、「11」、「212」、または「3123」を格納できます。これらは、番号の桁数を表す最初の桁です。

スコアと順序プロパティの両方が変更される可能性がある場合、これはあまり便利ではなく、クライアント側で並べ替えた方がよいでしょう。これは、一方の側でスコアを使用して zset を取得し、もう一方の側で対応する順序値を取得することにより、2 回のラウンドトリップで実現できます。

> zrange myset 0 -1 withscores
> sort myset by order:* get order:* get #

クライアントが 2 つの結果を結合し (ある種の辞書または連想配列を使用)、ソートして最終結果を取得します。

于 2012-05-02T10:18:07.050 に答える