Vous n'avez aucun index que mongo utilisera automatiquement pour cela, il effectue donc une analyse complète de la table.
Comme mentionné dans la documentation
Pourquoi
Si vous avez un index sur a,b - et que vous recherchez par a
seul - un index sera automatiquement utilisé. C'est parce que c'est le début de l'index (ce qui est rapide à faire), la base de données peut simplement ignorer le reste de la valeur de l'index.
Un index sur a,b est inefficace lors de la recherche par b
seul simplement parce qu'il ne donne pas la possibilité d'utiliser la recherche d'index avec "commence par cette chaîne fixe".
Donc, soit :
- Inclure _reference_1_id dans la requête (probablement non pertinent)
- OU ajoutez un index sur _reference_2_id (si vous interrogez souvent par champ)
- OU utilisez un indice
Astuce
Probablement votre option la moins chère en ce moment.
Ajoutez un indice de requête pour forcer l'utilisation de votre _reference_1_id_1__reference_2_id_1_id_1
indice. Ce qui est susceptible d'être beaucoup plus rapide qu'une analyse complète de la table, mais toujours beaucoup plus lent qu'un index qui commence par le champ que vous utilisez dans la requête.
c'est-à-dire
db.mycoll
.find({"_reference_2_id" : ObjectId("jkl7890123456")})
.hint("_reference_1_id_1__reference_2_id_1_id_1");