MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBインデックス入門:単一インデックスと複合インデックスの同時作成方法

MongoDBでインデックスを作成する

はい、ensureIndex()メソッドを使えば、単一フィールドのインデックスと複合インデックスを同時に作成することができます。MongoDBは、コレクション内のドキュメントの任意のフィールドに対するインデックス作成を完全にサポートしています。

なお、ensureIndex()は旧バージョンのメソッドであり、現在のMongoDBではcreateIndex()の使用が公式に推奨されています。基本的な動作はどちらも同じです。

複合インデックスの作成例

まず、コレクションに複合インデックスを作成してみましょう。以下の例では、_idNameAgeの3つのフィールドを組み合わせた複合インデックスを作成しています。

> db.demo622.ensureIndex({_id:1,Name:1,Age:1});
{
    "createdCollectionAutomatically" : true,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

出力結果を見ると、コレクションが自動的に作成され(createdCollectionAutomatically : true)、インデックス数が1から2に増えています。これは、デフォルトで存在する_idインデックスに加えて、新しい複合インデックスが追加されたことを意味します。

ドキュメントの挿入

次に、作成したコレクションにドキュメントを挿入していきます。

> db.demo622.insertOne({_id:101,Name:"Chris",Age:21});
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo622.insertOne({_id:102,Name:"Chris",Age:22});
{ "acknowledged" : true, "insertedId" : 102 }
> db.demo622.insertOne({_id:103,Name:"Bob",Age:21});
{ "acknowledged" : true, "insertedId" : 103 }
> db.demo622.insertOne({_id:104,Name:"Chris",Age:22});
{ "acknowledged" : true, "insertedId" : 104 }

重複キーエラー(E11000)の挙動

ここで、すでに存在する_id: 104と同じ値を持つドキュメントを再度挿入しようとすると、どうなるでしょうか。

> db.demo622.insertOne({_id:104,Name:"Chris",Age:22});
WriteError({
    "index" : 0,
    "code" : 11000,
    "errmsg" : "E11000 duplicate key error collection: test.demo622 index: _id_ dup key: { : 104.0 }",
    "op" : {
        "_id" : 104,
        "Name" : "Chris",
        "Age" : 22
    }
})

「E11000 duplicate key error」というエラーが発生しました。これは、_idフィールドに一意性(ユニーク制約)があるためです。このように、インデックスによってデータの一意性が自動的に保たれています。

そのため、別の_idを指定すれば、正常に挿入できます。

> db.demo622.insertOne({_id:105,Name:"Chris",Age:22});
{ "acknowledged" : true, "insertedId" : 105 }

find()メソッドで全ドキュメントを確認

find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。

> db.demo622.find();

実行結果は以下の通りです。

{ "_id" : 101, "Name" : "Chris", "Age" : 21 }
{ "_id" : 102, "Name" : "Chris", "Age" : 22 }
{ "_id" : 103, "Name" : "Bob", "Age" : 21 }
{ "_id" : 104, "Name" : "Chris", "Age" : 22 }
{ "_id" : 105, "Name" : "Chris", "Age" : 22 }

まとめ

MongoDBでは、ensureIndex()(現行バージョンではcreateIndex())を使うことで、単一フィールドのインデックスも、複数フィールドを組み合わせた複合インデックスも柔軟に作成できます。また、_idフィールドの一意制約により、重複ドキュメントの挿入は自動的に防がれます。適切なインデックス設計はクエリのパフォーマンス向上に大きく貢献するため、アプリケーションのアクセスパターンに応じてインデックスを活用しましょう。

  1. Tkinterで複数のキャンバスを同時に表示する方法

    TkinterのCanvas(キャンバス)ウィジェットは、もっとも汎用性の高いウィジェットのひとつです。図形や円弧(アーク)、画像の描画はもちろん、アプリケーション内でのイラスト作成や複雑なレイアウトの構築など、幅広い用途に活用できます。 Canvasウィジェットを生成するには、canvas(root, **options) という形式でコンストラクタを呼び出します。さらに、create_text や create_image、create_arc といったファクトリ関数を使えば、キャンバス上にテキスト・画像・円弧などを自由に描き込むことも可能です。 アプリケーション全体のワークフローに一貫

  2. メール1通でOK!TwitterとFacebookに同時投稿できるIFTTTメールトリック

    すべてのSNSアカウントをメールで更新するための鍵となるのが、IFTTTのような自動化サービスの活用です。TwitterやFacebookへの投稿タイプごとに複数のアプレットを設定しておけば、メールを1通送るだけで両方のSNSを同時に更新できます。投稿するには、IFTTTアカウントに登録しているメールアドレスから trigger@ifttt.com 宛てにメールを送信するだけです。 FacebookとTwitterへシンプルなテキストを同時投稿する方法 シンプルなステータス更新だけでよい場合は、「My Applets(マイアプレット)」にアクセスし、「New Applet(新規アプレット)」ボ