RÉPONSE 2019
Cette réponse est pour MongoDB 4.2
Après avoir lu la question et la discussion entre vous, je pense que le problème est résolu, mais l'optimisation reste un problème courant pour tous ceux qui utilisent MongoDB.
J'ai rencontré le même problème, et voici les conseils pour l'optimisation des requêtes.
Corrigez-moi si je me trompe :)
Les index jouent un rôle essentiel dans l'exécution rapide des requêtes, car les index sont des structures de données qui peuvent stocker l'ensemble de données de la collection sous une forme facile à parcourir. Les requêtes sont exécutées efficacement à l'aide d'index dans MongoDB.
Vous pouvez créer différents types d'index selon vos besoins. En savoir plus sur les index ici, la documentation officielle de MongoDB.
- Toujours utiliser $match avant $project , car les filtres suppriment les documents et champs supplémentaires de l'étape suivante.
- N'oubliez jamais que les index sont utilisés par $match et $sort . Essayez donc d'ajouter un index aux champs sur lesquels vous allez trier ou filtrer les documents.
- Essayez de conserver cette séquence dans votre requête, utilisez $sort avant $limit comme $sort + $limit + $skip. Parce que $sort tire parti de l'index et permet à MongoDB de sélectionner le plan de requête requis lors de l'exécution de la requête.
- Toujours utiliser $limit avant $skip afin que le saut soit appliqué pour limiter les documents.
- Utilisez $project pour renvoyer uniquement les données nécessaires à l'étape suivante.
-
Toujours créer un index sur les attributs foreignField dans un $lookup . De plus, comme la recherche produit un tableau, nous le déroulons généralement à l'étape suivante. Ainsi, au lieu de le dérouler à l'étape suivante, déroulez-le dans la recherche comme :
{ $lookup: { from: "Collection", as: "resultingArrays", localField: "x", foreignField: "y", unwinding: { preserveNullAndEmptyArrays: false }
}}
-
Utilisez allowDiskUse en agrégation, à l'aide de celui-ci, les opérations d'agrégation peuvent écrire des données dans le sous-répertoire _tmp du répertoire Database Path. Il est utilisé pour effectuer la grande requête sur le répertoire temporaire. Par exemple :
db.orders.aggregate( [ { $match: { status: "A" } }, { $group: { _id: "$uid", total: { $sum: 1 } } }, { $sort: { total: -1 } } ], { allowDiskUse: true }, )
Si vous créez et supprimez des index assez souvent, reconstruisez vos index. Cela aide MongoDB à rafraîchir, le plan de requête précédemment stocké, le cache, qui continue de prendre en charge le plan de requête requis, croyez-moi, ce problème est nul :(
Trop d'index prennent trop de temps dans les opérations de création, de mise à jour et de suppression car ils doivent créer un index avec leurs tâches. Donc, les supprimer aide beaucoup.
Dans un scénario réel, la récupération des données complètes présentes dans la base de données n'aide pas. En outre, soit vous ne pouvez pas l'afficher, soit l'utilisateur ne peut pas lire les données récupérées complètes. Ainsi, au lieu de récupérer des données complètes, récupérez des données en morceaux, ce qui vous aide, vous et votre client, à regarder ces données.
Et enfin, regarder quel plan d'exécution est sélectionné par MongoDB aide à déterminer le problème principal. Ainsi, $explain vous aidera à le déterminer.
J'espère que ce résumé vous aidera les gars, n'hésitez pas à suggérer de nouveaux points si j'en ai manqué. Je vais les ajouter aussi.