Votre explain() les résultats suggèrent que :
-
Il y a 10962 objets qui ont
key.a : 456213154. Votredb.collection.find({"key.a": 456213154})la requête a utilisé l'index surkey.a, et a renvoyé 10962 objets. -
Il y a 0 objets dans votre collection qui ont
key.a : 456213154et avoirkey.b : { $exists : true }. Ledb.collection.find({"key": {"a": 456213154, "b": {"$exists":true}}})la requête a utilisé votre index sur la clé.
Voir le n valeur pour chaque requête - il s'agit du nombre renvoyé ; et le cursor valeur - c'est BtreeCursor si un index est utilisé. Dans ce cas, il serait logique que la première requête prenne beaucoup plus de temps, car elle a beaucoup plus d'objets à renvoyer.
Êtes-vous sûr que les documents avec key.a : 456213154 les valeurs ont aussi key.b valeurs ?
Modifier :
La requête avec le $exists param est la mauvaise syntaxe pour vérifier l'existence dans les documents intégrés.
Essayez db.collection.find({ "key.a" : 456213154, "key.b" : { "$exists" : true } }) .