sql >> データベース >  >> NoSQL >> Redis

範囲でフィルターを再分割し、最初に10を並べ替えて返します

    説明するユースケースは、NoSQLソリューションでエレガントにモデル化することはできません。これはRedisの制限ではありません。

    もう少し説明させてください。あるフィールドで範囲クエリを実行し、別のフィールドで並べ替えています。これは、NoSQLソリューションが得意なことではありません。たとえば、GoogleAppEngineはそのようなクエリを禁止しています。 GAEクエリの制限を確認し、「不等式フィルターのプロパティは他の並べ替え順序よりも前に並べ替える必要がある」セクションをお読みください

    不等式フィルターに一致するすべての結果を取得するために、クエリはインデックステーブルをスキャンして最初に一致する行を探し、一致しない行が見つかるまですべての連続した結果を返します。連続する行が完全な結果セットを表すには、行を他の並べ替え順序の前に不等式フィルターで並べ替える必要があります。

    そうは言っても、クエリを効率的に実行することはできますが、ソリューションは洗練されたものにはなりません。

    1. 給与範囲を作成します-0〜5000、5000〜10000、10000〜15000など
    2. users_with_salary:10000-15000のようなセットを作成します 。このセットには、指定された範囲の給与を持つユーザーIDが含まれます。
    3. 同様に、 `users_with_rating:1-2"のようなセットを作成します。このセットには、指定された範囲の評価を持つユーザーIDが含まれます
    4. 次に、次の擬似コードを実行します
    
    String userids[];
    for(rating = 10; rating > 0; rating--) {
      for(salary = min_salary; salary < max_salary; salary += 5000) {
          String salary_key = "users_with_salary:" + salary + "-" + (salary+5000);
          String rating_key = "users_with_rating:" + rating + "-" + (rating+1);
    
          userids.append(redis.sinter(salary_key, rating_key));
    
          if(userids.length > 10) {
             break;
          }
       }
    }
    
    

    redis 2.6とluaスクリプトを使用すると、これをluaサーバーで実行することもできます。

    結論として、データに対して複雑なクエリを実行する場合は、リレーショナルデータベースでモデル化するのが最適です。



    1. パフォーマンスを再実行し、jsonオブジェクトを文字列として保存します

    2. Mongoose、Express、NodeJSでモデルを更新

    3. MongoDB cursor.count()

    4. UUIDの短縮