MongoDB-এ $elemMatch কোয়েরি করলে ইন্ডেক্স সঠিকভাবে ব্যবহার হচ্ছে কিনা তা যাচাই করতে explain() মেথড ব্যবহার করা হয়। এটি কোয়েরি প্ল্যান দেখায়।
ইন্ডেক্স তৈরি ও ডেটা ইনসার্ট
> db.workingOfIndexesDemo.createIndex({"Information.StudentDetails.StudentName":1},{ sparse: true, background: true });
{ "createdCollectionAutomatically" : true, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
> 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") }
সব ডকুমেন্ট দেখানো
> db.workingOfIndexesDemo.find();
আউটপুট:
{ "_id" : ObjectId("5e06f94825ddae1f53b621f7"), "Information" : { "StudentDetails" : { "StudentName" : "Chris" } } }
{ "_id" : ObjectId("5e06f94f25ddae1f53b621f8"), "Information" : { "StudentDetails" : { "StudentName" : "David" } } }
{ "_id" : ObjectId("5e06f95325ddae1f53b621f9"), "Information" : { "StudentDetails" : { "StudentName" : "Mike" } } }
explain() দিয়ে কোয়েরি প্ল্যান দেখা
> db.workingOfIndexesDemo.find({"Information.StudentDetails": { $elemMatch: { "StudentName" : "David"} } }).explain();
আউটপুটের প্রাসঙ্গিক অংশ (winningPlan):
"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,
"isSparse" : true,
"indexBounds" : { "Information.StudentDetails.StudentName" : [ "[\"David\", \"David\"]" ] }
}
}
বিশ্লেষণ: `stage: "IXSCAN"` দেখাচ্ছে যে ইন্ডেক্স ব্যবহার হয়েছে। `filter` স্টেজে `$elemMatch` আছে, অর্থাৎ ইন্ডেক্স ক্যান্ডিডেট খুঁজে বের করলেও ফাইনাল ফিল্টারে `$elemMatch` লজিক প্রয়োগ হয়েছে। স্পার্স ইন্ডেক্স (`isSparse: true`) নাল ভ্যালু বাদ দিয়ে কাজ করে।