$elemMatch実行時にMongoDBのインデックスは機能しない?explain()での確認方法を解説
MongoDBで$elemMatchを使用したクエリにおいて、インデックスが正しく機能しているかどうかを確認するには、explain()メソッドを活用するのが確実です。この記事では、実際にコレクションとドキュメントを作成し、$elemMatchを実行した際にインデックススキャン(IXSCAN)が使われているかを検証する手順を、具体的なコード例とともに解説します。
1. インデックスの作成とテストデータの投入
まず、createIndex()メソッドを使い、ネストされたフィールド「Information.StudentDetails.StudentName」に対して、sparseオプションとbackgroundオプションを指定したインデックスを作成します。
> db.workingOfIndexesDemo.createIndex({"Information.StudentDetails.StudentName":1},{ sparse : true, background : true } );
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
続いて、insertOne()メソッドでテスト用のドキュメントを3件登録します。
> db.workingOfIndexesDemo.insertOne({"Information":{"StudentDetails":{"StudentName":"Chris"}}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06f94825ddae1f53b621f7")
}
> db.workingOfIndexesDemo.insertOne({"Information":{"StudentDetails":{"StudentName":"David"}}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06f94f25ddae1f53b621f8")
}
> db.workingOfIndexesDemo.insertOne({"Information":{"StudentDetails":{"StudentName":"Mike"}}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06f95325ddae1f53b621f9")
}
2. 登録済みドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.workingOfIndexesDemo.find();
実行結果は以下の通りです。
{ "_id" : ObjectId("5e06f94825ddae1f53b621f7"), "Information" : { "StudentDetails" : { "StudentName" : "Chris" } } }
{ "_id" : ObjectId("5e06f94f25ddae1f53b621f8"), "Information" : { "StudentDetails" : { "StudentName" : "David" } } }
{ "_id" : ObjectId("5e06f95325ddae1f53b621f9"), "Information" : { "StudentDetails" : { "StudentName" : "Mike" } } }
3. $elemMatchとexplain()による実行計画の検証
次に、$elemMatchを含むクエリにexplain()を組み合わせて実行し、インデックスが実際に利用されているかを確認します。
> db.workingOfIndexesDemo.find({"Information.StudentDetails": { $elemMatch: { "StudentName" : "David"} } } ).explain();
実行結果は以下の通りです。
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.workingOfIndexesDemo",
"indexFilterSet" : false,
"parsedQuery" : {
"Information.StudentDetails" : {
"$elemMatch" : {
"StudentName" : {
"$eq" : "David"
}
}
}
},
"winningPlan" : {
"stage" : "FETCH",
"filter" : {
"Information.StudentDetails" : {
"$elemMatch" : {
"StudentName" : {
"$eq" : "David"
}
}
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"Information.StudentDetails.StudentName" : 1
},
"indexName" : "Information.StudentDetails.StudentName_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"Information.StudentDetails.StudentName" : [ ]
},
"isUnique" : false,
"isSparse" : true,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"Information.StudentDetails.StudentName" : [
"[\"David\", \"David\"]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "DESKTOP-QN2RB3H",
"port" : 27017,
"version" : "4.0.5",
"gitVersion" : "3739429dd92b92d1b0ab120911a23d50bf03c412"
},
"ok" : 1
}
4. 実行結果の読み方とポイント
explain()の出力からは、次の重要な情報を読み取ることができます。
- inputStageのstageが「IXSCAN」 … コレクションフルスキャン(COLLSCAN)ではなく、インデックススキャンが採用されていることを示します。
- indexNameが「Information.StudentDetails.StudentName_1」 … 作成したインデックスが実際にクエリで使用されていることがわかります。
- indexBoundsが["David", "David"] … クエリ条件に一致する範囲だけをインデックスで精密に絞り込めていることを示します。
- isSparseがtrue … sparseオプション付きで作成したインデックスであることが確認できます。
まとめ
このように、$elemMatchを使用するクエリでも、対象フィールドに適切なインデックスを作成しておけば、実行計画にIXSCANが現れ、インデックスが正しく機能していることを確認できます。「$elemMatchではインデックスが効かないのでは?」という疑問を持ったときは、explain()で実行計画をチェックするのがトラブルシューティングの第一歩です。パフォーマンスの問題を調査する際には、必ずexplain()の結果を確認する習慣をつけましょう。
-
【解決】PS4コントローラーをPCに接続すると音が出ないときの対処法7選
ゲーマーの方なら、PS4はお気に入りのゲーム機のひとつではないでしょうか。本記事は、そんなプレイヤーの皆さんに向けてお届けします。PS4でお気に入りのゲームを楽しんでいる最中に、突然音声が途切れたり、まったく音が出なくなったりした経験はありませんか?もしそのような状況に直面しても慌てる必要はありません。「PS4から音が出ない」という問題を解決するための効果的な対処法をまとめてご紹介します。 PS4コントローラーを接続すると音が出ない原因は? PS4コントローラーを接続した際に音が出なくなる原因は、いくつか考えられます。 PS4コントローラーのUSBケーブルの不具合 オーディオ設定の誤り デバ
-
Windowsフィードバックハブが動作しないときの対処法【4つの解決策】
Microsoftはユーザーからのフィードバックを大切にし、報告された問題やエラーの改善に積極的に取り組んでいます。その一環として、Windows 10以降には「フィードバックハブ」というアプリが標準搭載されており、コメントや提案、不具合の報告をMicrosoftへ直接送信できます。しかし、「フィードバックハブが起動しない」「動作しない」といったトラブルが発生することもあります。本記事では、Windows PCでフィードバックハブが正常に動作しない場合の解決策を、初心者にもわかりやすく解説します。 Windowsフィードバックハブが動作しないときの直し方 方法1:Windowsを最新の状態に更