Il tuo explain() le uscite suggeriscono che:
-
Ci sono 10962 oggetti che hanno
key.a : 456213154. Il tuodb.collection.find({"key.a": 456213154})query ha utilizzato l'indice sukey.ae ha restituito 10962 oggetti. -
Ci sono 0 oggetti nella tua collezione che hanno
key.a : 456213154e averekey.b : { $exists : true }. Ildb.collection.find({"key": {"a": 456213154, "b": {"$exists":true}}})query ha utilizzato il tuo indice sulla chiave.
Vedi il n valore per ogni query - questo è il numero restituito; e il cursor valore - questo è BtreeCursor se viene utilizzato un indice. In questo caso avrebbe senso perché la prima query richiede molto più tempo, perché ha molti più oggetti da restituire.
Sei sicuro che i documenti con key.a : 456213154 i valori hanno anche key.b valori?
Modifica:
La query con $exists param è la sintassi sbagliata per verificare l'esistenza all'interno di documenti incorporati.
Prova db.collection.find({ "key.a" : 456213154, "key.b" : { "$exists" : true } }) .