I have this query:
var cursor = groupCollection .Find( teamsQueryBuilder.ElemMatch(g => g.Teams, teamQueryBuilder.Eq(t => t.TeamId, teamId)) ); cursor.Options.Modifiers = new BsonDocument("$explain", true); var result = cursor.Project(new BsonDocument()).FirstOrDefault();
So, I created an index like this:
groupCollection.Indexes .CreateOne(Builders<Group>.IndexKeys .Ascending(g => g.Teams[-1].TeamId));
{ "v" : 1, "name" : "teams.$.teamId_1", "key" : { "teams.$.teamId" : 1 }, "ns" : "spochdb_dev.organization.teamgroups" }
When I ran the query, I got the following explain:
{ "cursor" : "BasicCursor", "isMultiKey" : false, "n" : 1, "nscannedObjects" : 1, "nscanned" : 1, "nscannedObjectsAllPlans" : 1, "nscannedAllPlans" : 1, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "indexBounds" : {}, "allPlans" : [{ "cursor" : "BasicCursor", "n" : 1, "nscannedObjects" : 1, "nscanned" : 1, "indexBounds" : {} } ], "server" : "DESKTOP-J8M6V6N:27017" }
But, if I change the index creation code to this:
groupCollection.Indexes
.CreateOne(Builders<Group>.IndexKeys
.Ascending("teams.teamId"));
{ "v" : 1, "name" : "teams.teamId_1", "key" : { "teams.teamId" : 1 }, "ns" : "spochdb_dev.organization.teamgroups" }
and run the query again, I get the following explain:
{ { "cursor" : "BtreeCursor teams.teamId_1", "isMultiKey" : true, "n" : 1, "nscannedObjects" : 1, "nscanned" : 1, "nscannedObjectsAllPlans" : 1, "nscannedAllPlans" : 1, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "indexBounds" : { "teams.teamId" : [[ObjectId("5881760396839d0e94fdf5a5"), ObjectId("5881760396839d0e94fdf5a5")]] }, "allPlans" : [{ "cursor" : "BtreeCursor teams.teamId_1", "n" : 1, "nscannedObjects" : 1, "nscanned" : 1, "indexBounds" : { "teams.teamId" : [[ObjectId("5881760396839d0e94fdf5a5"), ObjectId("5881760396839d0e94fdf5a5")]] } } ], "oldPlan" : { "cursor" : "BtreeCursor teams.teamId_1", "indexBounds" : { "teams.teamId" : [[ObjectId("5881760396839d0e94fdf5a5"), ObjectId("5881760396839d0e94fdf5a5")]] } }, "server" : "DESKTOP-J8M6V6N:27017" } }
We're using databse version v2.4.14 (git version 05bebf9ab15511a71bfbded684bb226014c0a553) at the moment, if that makes a difference.
If it doesn't make a difference, why is the driver generating unusable indexes?