Ich führe eine Abfrage mit $ elemMatch aus und es scheint, als ob sie nicht den Index verwendet, den ich dafür hinzugefügt habe.
Hier ist mein Dokument:
{
"_id" : "123466",
"something" : [
{
"someID" : ObjectId("5701b4c3c6b126083332e66f"),
"tags":
[
{
"tagKey": "ErrorCode",
"tagValue": "7001"
},
{
"tagKey": "ErrorDescription",
"tagValue": "nullPointer"
}
],
"removeOnDelivery" : true,
"entryTime" : ISODate("2016-04-04T00:26:43.167Z")
}
]
}
Hier sind die Indizes ich verwende (I soll nur der erste Index verwenden, aber ich hinzugefügt, um zusätzliche Indizes zu untersuchen, warum keiner von ihnen arbeiten).
db.test.createIndex({ "something.tags:" : 1 }, { sparse : true, background : true })
db.test.createIndex({ "something.tags.tagKey:" : 1 }, { sparse : true, background : true })
db.test.createIndex({ "something.tags.tagValue:" : 1 }, { sparse : true, background : true })
db.test.createIndex({ "something.tags.tagKey:" : 1, "something.tags.tagValue:" : 1 }, { sparse : true, background : true })
Hier ist meine Frage und Antwort:
db.test.find({"something.tags": { $elemMatch: { "tagKey" : "ErrorCode", "tagValue" : "7001" } } }).explain()
{
"cursor": "BasicCursor",
"isMultiKey": false,
"n": 2,
"nscannedObjects": 2,
"nscanned": 2,
"nscannedObjectsAllPlans": 2,
"nscannedAllPlans": 2,
"scanAndOrder": false,
"indexOnly": false,
"nYields": 0,
"nChunkSkips": 0,
"millis": 0,
"server": "some_server",
"filterSet": false,
"stats": {
"type": "COLLSCAN",
"works": 4,
"yields": 0,
"unyields": 0,
"invalidates": 0,
"advanced": 2,
"needTime": 1,
"needFetch": 0,
"isEOF": 1,
"docsTested": 2,
"children": []
}
}
Welche Server-Version? Sieht nach einem Ergebnis der 2.6.x-Serie aus. Beachten Sie, dass es nur 2 Dokumente in der Sammlung gibt, so dass der Planer wahrscheinlich nur einen Screenshot für einen Sammlungsscan erstellt. –