Techniques simples pour effectuer des opérations de jointure dans MongoDB
Simple techniques for performing join operations in MongoDB.
Introduction
Les personnes travaillant avec des bases de données sont très familières avec les JOINS. Lorsque nous voulons récupérer des données à partir de plusieurs tables, nous joignons souvent les tables en fonction des clés primaires et des clés étrangères. Dans cet article, nous allons apprendre les techniques simples pour effectuer des opérations de jointure dans MongoDB.

Le diagramme ci-dessus est une représentation picturale du schéma de base de données relationnelle de n’importe quelle organisation. Ces blocs sont des tables stockant des types de données particuliers (étudiants/professeurs/employés) et les lignes et les flèches représentent la relation entre les tables en utilisant des clés communes. Nous pouvons effectuer des jointures entre les tables en fonction des relations entre elles.
Par exemple : Dans une organisation, il y a des tables distinctes pour stocker les données des employés, des départements, des projets, etc., où les données sont stockées de manière normalisée. Pour récupérer les détails des employés et dans quel département et projet ils travaillent, nous devons effectuer une jointure entre les tables et récupérer les données requises.
De même, dans une université, il peut y avoir des tables distinctes pour stocker les données des étudiants et des professeurs. Pour savoir quels professeurs enseignent à un étudiant particulier, nous devons effectuer une jointure entre les tables.
- Conseils d’investissement en Intelligence Artificielle – Avantages et Inconvénients
- Comment les cyborgs diffèrent-ils de l’IA ?
- Investir dans les Altcoins Un guide complet du marché de la crypto-monnaie.
Objectif d’apprentissage
Dans ce tutoriel particulier, nous allons voir comment effectuer différentes opérations de jointure (jointure interne, jointure externe, jointure droite et jointure gauche) dans MongoDB.
Cet article a été publié dans le cadre du Data Science Blogathon.
Comprendre les différents types d’opérations de jointure courantes
A. SQL et différents types de jointures
La majorité d’entre nous ont des connaissances en bases de données SQL. Nous y effectuons souvent quatre types principaux de jointures que nous discuterons ci-dessous.
1. Jointure interne : Seules les lignes avec des clés communes des deux tables seront présentes dans la table résultante.


Comme nous pouvons le voir après avoir effectué des jointures internes, nous avons uniquement renvoyé les lignes où la clé Numéro de rouleau est commune aux deux.
2. Jointure externe gauche : Toutes les lignes de la table de gauche (clés correspondantes + clés non correspondantes) seront dans la table résultante. Ainsi, dans la table résultante, seules les lignes avec des clés correspondantes de la table de droite seront présentes ; vous ne pouvez pas les éliminer pour les lignes où les clés ne correspondent pas.

Après avoir effectué la jointure gauche, nous avons toutes les colonnes de la table de gauche. Comme Classement de classe pour Deepak K. n’est pas présent dans la table de droite, nous le remplissons par null. Comme discuté, seuls les enregistrements de la table de droite correspondant à la clé Numéro de rouleau avec la table de gauche sont présents dans les résultats. C’est pourquoi le tuple (3D5RE,16) de la table de droite n’est pas dans le résultat.
3. Jointure externe droite : L’opposé de la jointure externe gauche. Ici, toutes les lignes de la table de droite seront présentes dans la table résultante et seules les lignes avec des clés correspondantes de la table de gauche seront présentes.

Comme prévu, tous les enregistrements/tuples de la table de droite sont présents dans le résultat, mais l’enregistrement (2A3AS, Deepak K., 87) de la table de gauche est absent.
4. Jointure externe complète : Toutes les lignes des deux tables (clés correspondantes et non correspondantes) seront présentes dans la table résultante.

Comme prévu, nous avons tous les tuples des deux tables dans notre résultat. Les endroits où les valeurs ne sont pas présentes sont remplis avec null.
B. Brève introduction à MongoDB
MongoDB est une base de données NoSQL basée sur des documents. Les bases de données NoSQL sont mieux adaptées pour stocker des données à grande échelle, non relationnelles, non structurées et fréquemment modifiées. Les deux blogs suivants comparent les opérations MongoDB.
- Introduction à MongoDB
- Opérations CRUD dans MongoDB
La base de données MongoDB est composée d’une ou plusieurs Collections. Les collections peuvent être considérées comme équivalentes aux tables des bases de données SQL. Chaque collection est composée d’un ou plusieurs documents. Ainsi, les documents peuvent être considérés comme des lignes ou des tuples d’une table dans les bases de données SQL. Les données sont stockées au format BSON (Binary JSON) à l’intérieur de MongoDB.

Opération de jointure dans MongoDB
Voyons maintenant comment différentes opérations de jointure se comportent sur les collections MongoDB.
Convertissez les deux tables Marks et Rank en collections, chaque tuple étant un document des collections respectives. Stockez les collections dans une base de données nommée School dans MongoDB.


Jointure externe gauche
Code :
db.Marks.aggregate([{$lookup:{from:"Rank",localField:"Roll No",
foreignField:"Roll No",as:"Ranks"}}])

[Agrandir la sortie]
Comme nous pouvons le voir, les détails de classement de l’étudiant correspondant sont ajoutés à son document. Pour Deepak, il n’y a pas de détails de classement dans la table Rank, donc évidemment, son champ Ranks est une liste vide.
Comprenez maintenant les paramètres utilisés :
- Ici, Marks est notre table de gauche.
- $lookup est la fonction/opérateur d’agrégation pour effectuer une jointure entre deux collections.
- À l’intérieur de la jointure, from indique la collection avec laquelle nous voulons effectuer une jointure, c’est-à-dire notre table de droite (collection). Dans notre cas, Rank est notre collection de droite.
- localField indique la clé de la collection de gauche qui sera comparée à la clé de la collection de droite pour effectuer une jointure. Si une clé correspondante est trouvée dans le champ de la collection de droite, le champ résultant (ici Ranks) n’est pas vide, sinon il est vide (cas de Deepak dans notre exemple).
- foreignField est la clé de la collection de droite.
- as indique le nom du nouveau champ qui sera créé dans la table/collection résultante en raison de la jointure, où les détails de la table de droite (collection) seront stockés.
- Dans notre cas, ajoutez le nouveau champ Ranks à la table/collection résultante, qui contient les détails des classements des étudiants correspondants.
Maintenant, une chose à retenir, dans MongoDB, $lookup ne peut effectuer que des jointures à gauche et il n’existe aucune syntaxe spécifique disponible pour d’autres types de jointures. Nous devons donc dériver les autres jointures en utilisant différentes astuces et opérations
Jointure externe droite
La jointure droite est exactement l’opposée de la jointure gauche où, en plus des enregistrements correspondants, les enregistrements non correspondants de la table/collection de droite doivent également être présents dans la table/collection résultante.
Une façon simple de faire cela est simplement d’alterner la position des deux collections ; alors notre collection de droite devient la gauche et vice versa. Ainsi, maintenant, la jointure contiendra toutes les lignes (correspondantes + non correspondantes) de notre table de droite.
Code :
db.Rank.aggregate([{$lookup:{from:"Marks", localField:"Roll No",
foreignField:"Roll No", as:"Marks_Students"}}])
[Agrandir la sortie]
Jointure interne
Nous pouvons effectuer efficacement une jointure interne avec une astuce simple !!! Nous ferons une jointure gauche, puis supprimerons tous les enregistrements où le champ as est vide. Nous ne conserverons donc que les enregistrements où les clés sont présentes dans les deux tables (collections).
Code :
db.Rank.aggregate([{$lookup:{from:"Marks", localField:"Roll No", foreignField:"Roll No",
as: "Marks_Students"}}, {$match:{"Marks_Students":{$ne:[]}}}])

[Agrandir la sortie]
Comme nous pouvons le voir dans le résultat ci-dessus, nous n’avons que les enregistrements pour lesquels les clés des deux collections correspondent. Ici, {$match:{“Marks_Students”:{$ne:[]}}} indique de ne correspondre qu’aux enregistrements où le champ Marks_Students n’est pas une liste vide
Jointure externe complète
La jointure externe complète est un peu compliquée, je l’ai conçue en combinant 3 opérations. Donc, si cela semble confus la première fois, je vous demande de le lire plusieurs fois pour une meilleure compréhension.
Étape 1 : Nous ferons une jointure gauche de Marks (collection de gauche) et Rank (collection de droite) et ajouterons un champ vide nommé Marks à tous les enregistrements résultants et enverrons/sortirons le résultat dans une nouvelle collection appelée J2.
Code :
db.Marks.aggregate([{$lookup:{from:"Rank",localField:"Roll No", foreignField:"Roll No", as:"Rank"}},
{$addFields:{Marks:[]}},{$out:"J2"}])

[Agrandir la sortie]
Donc, notre nouvelle collection ressemble à la capture d’écran ci-dessus.
- {$addFields:{Marks:[]}} -> ajouter un champ supplémentaire Marks à tous les enregistrements.
- {$out:”J2″} -> envoie/sortie le résultat dans une nouvelle collection J2.
Maintenant, comme c’est évident, notre base de données School contient 3 collections-
Marks, Rank, J2

Étape 2 : Nous effectuerons une jointure externe droite (comme discuté précédemment en considérant Rang comme la collection de gauche) entre Notes et Rang et nous ajouterons le résultat à la collection J2.
Code :
db.Rang.aggregate([{$lookup:{from:"Notes",localField:"Numéro d'inscription",foreignField:"Numéro d'inscription",
as:"Notes"}},{$merge:"J2"}])

[Agrandir la sortie]

[Agrandir la sortie]
Remarquez comment le système ajoute la nouvelle sortie en bas de l’ancienne sortie de l’étape 1.
Étape 3 :
Nous garderons uniquement les enregistrements dans notre résultat d’agrégation où le champ Match est vide et nous éliminerons le reste. De cette manière, nous supprimerons les doublons et nous n’aurons dans nos résultats que les champs distincts des deux collections/tables. (Vous avez peut-être remarqué dans la sortie de l’étape 2 qu’il y a des doublons, par exemple : Il y a deux enregistrements de Nikita)
Enfin, nous supprimerons le champ Notes vide du résultat de l’agrégation car il est vide et il est inutile de l’afficher. Son but était de supprimer les doublons.
Code :
db.J2.aggregate([{$redact:{$cond:[{$eq:["$Notes",[]]},"$KEEP","$PRUNE"]}},
{$unset:"Notes"}])

[Agrandir la sortie]
Nous avons donc finalement notre sortie souhaitée. Nous avons tous les enregistrements qui correspondent dans les deux tables (collections) ainsi que d’autres enregistrements présents dans l’une ou l’autre des tables (collections). (Deepak dans Notes et le numéro d’inscription 3D5RE dans Rang).
Conclusion
Nous avons donc réussi à obtenir différents types de jointures à partir de la jointure externe gauche dans MongoDB. Donc, pour récapituler, il n’y a qu’une seule syntaxe directe disponible dans MongoDB pour effectuer des jointures externes gauches. Les autres types de jointures doivent être dérivés en appliquant différents types d’opérations et de techniques sur la jointure externe gauche. Par exemple : supprimer les collections avec un champ as vide en cas de jointure interne, etc.
En dérivant ces jointures, nous avons réalisé :
- Une bonne connaissance des requêtes d’agrégation est nécessaire.
- Une observation attentive des résultats intermédiaires est nécessaire pour décider de l’étape suivante.
- Il peut exister d’autres (même meilleures) façons de dériver les jointures.
Si vous connaissez de meilleures façons, n’hésitez pas à les partager dans les commentaires.
Points clés
- Seule l’opération de jointure externe gauche a une syntaxe directe dans MongoDB.
- Dérivez la jointure externe droite en modifiant la position des collections dans la syntaxe.
- Dérivez la jointure interne en effectuant d’abord la jointure externe gauche, puis en supprimant le champ as vide.
- Les jointures externes peuvent être effectuées par une série d’opérations simples et ingénieuses.
Questions fréquemment posées
Références
- Documentation MongoDB sur Lookup
- Documentation officielle MongoDB sur $redact
- MongoDB Inner Join 101: Syntaxe et exemple simplifiés par Samuel Salimon
Les médias présentés dans cet article n’appartiennent pas à Analytics Vidhya et sont utilisés à la discrétion de l’auteur.
We will continue to update IPGirl; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- Les meilleures plateformes pour trouver des emplois en IA
- ANOVA à deux facteurs en R
- Comprendre les lois sur la propriété intellectuelle dans le trading algorithmique et l’IA en finance.
- Les logiciels d’IA dans les centres d’appels révolutionnent le service client.
- Rapport McKinsey Qu’est-ce que cela signifie pour les ventes B2B ?
- Un guide complet sur les tarifs, les plans et les avantages de la marketing Insightly.
- Meilleurs cours et emplois en intelligence artificielle (2023)