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

MongoDBインデックスビルド–ユーザーが新しいビルドをトリガーできないようにする

    MongoDBプロダクションクラスターでのインデックスビルドは、細心の注意を払って処理する必要があります。この問題については、以前のブログ投稿の1つであるMongoDBでのインデックス作成の危険性について詳しく説明しています。

    データのサイズによっては、フォアグラウンドビルドとバックグラウンドビルドの両方でクラスターがダウンする可能性があります。では、ユーザーが誤ってMongoDBCLIからインデックスビルドをトリガーするのを防ぐにはどうすればよいでしょうか。簡単に言えば、あなたはできないということです。ただし、できることは、ほとんどのユーザーから「CreateIndex」特権を削除して、CLIから誤ってインデックスビルドをトリガーしないようにすることです。システムには、データベースにデータを書き込むためのアクセス権を持つユーザーはほとんどいないはずです。これらのユーザーの中で、インデックスを作成する権限を持っているユーザーはさらに少なくなります。 MongoDBロールの使用方法の入門書については、ドキュメント–ユーザーとロールの管理を参照してください。

    これを実装するための最良のオプションは、独自のカスタムロールを作成し、ユーザーの「CreateIndex」権限を削除することです。ただし、権限のリストはコンテキストごとに、場合によってはMongoDBのバージョンごとに異なるため、手動で作成する必要はありませんでした。この小さなスクリプトをまとめて、既存の組み込みの役割の1つを使用し、この役割から「CreateIndex」権限を削除しました。この例では、組み込みの「readWrite」ロールを使用し、このロールから「CreateIndex」権限を削除しています。

    var privs = db.getRole('readWrite',{ showPrivileges: true });
    privs.privileges.forEach(function (item, index) {
      var index = item.actions.indexOf("createIndex");
      if (index !== -1) item.actions.splice(index, 1);
    });
    db.createRole({role:"readWriteNoIndex",privileges:privs.privileges,roles:[]});
    
    1. コードスニペットの内容をcreateRole.jsとして保存します。
    2. 以下の構文を使用してスクリプトを実行します:
    mongo -u <user> -p <password> <host>:27017/<db name> --authenticationDatabase admin createRole.js
    

    ロールが作成されると、このロールを使用して今後ユーザーを作成できます。

    その他のヒント

    MongoDBで大文字と小文字を区別しないインデックスを作成する方法

    大文字と小文字を区別しないインデックスは、大文字と小文字を区別せずに文字列比較を実行するクエリをサポートします。照合により、文字列比較のための言語固有のルールを指定できます。詳細

    MongoDBで暴走インデックスのビルドを停止する方法

    MongoDBでのインデックスのビルドは、クラスターの可用性に悪影響を与える可能性があります。大規模なコレクションでフォアグラウンドインデックスビルドをトリガーすると、インデックスビルドが完了するまでクラスターが応答しなくなる可能性があります。詳細

    MongoDB正規表現、インデックス、パフォーマンス

    MongoDBは、$regex演算子を使用した正規表現をサポートしています。ただし、これらのMongoDB正規表現クエリには欠点があります。1つのタイプを除くすべての正規表現では、インデックスの使用が不十分であり、パフォーマンスの問題が発生します。詳細


    1. hgetおよびhsetコマンドのRedisベンチマーク

    2. ブラウザで実行されているJavaScriptからRedisサーバーに直接接続できますか?

    3. MongoDB C#ドライバーを使用してMongoDBコレクションが作成された日付を取得するにはどうすればよいですか?

    4. 変数を正規表現に渡す方法