Tu explain() los resultados sugieren que:
-
Hay 10962 objetos que tienen
key.a : 456213154. Tudb.collection.find({"key.a": 456213154})la consulta usó el índice enkey.ay devolvió 10962 objetos. -
Hay 0 objetos en tu colección que tienen
key.a : 456213154y tienekey.b : { $exists : true }.db.collection.find({"key": {"a": 456213154, "b": {"$exists":true}}})la consulta usó su índice en la clave.
Ver el n valor para cada consulta:este es el número devuelto; y el cursor valor - esto es BtreeCursor si se utiliza un índice. En este caso, tendría sentido por qué la primera consulta tarda mucho más, porque tiene muchos más objetos para devolver.
¿Estás seguro de que los documentos con key.a : 456213154 los valores también tienen key.b valores?
Editar:
La consulta con $exists param es la sintaxis incorrecta para verificar la existencia dentro de documentos incrustados.
Prueba db.collection.find({ "key.a" : 456213154, "key.b" : { "$exists" : true } }) .