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.

Source de l'image: Pixabay

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.

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.

Deux tables de l'ensemble de données scolaires - Notes et Classement
Jointure interne

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.

Jointure externe gauche

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.

Jointure externe droite

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.

Jointure externe complète

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.

Format de stockage des données 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.

Marks
Ranks

Jointure externe gauche

Code :

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

[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:[]}}}])
Résultat de la jointure interne

[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"}])
Résultat de l'étape 1

[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

Collections

É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"}])
Résultat de l'étape 2

[Agrandir la sortie]

Résultat de l'étape 2 suite...

[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"}])
Résultat de l'étape 3

[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!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

AI

L'essor de l'IA Guide pratique de l'IA générative pour les petites entreprises

Au cours des dernières années, le monde a été témoin d'une augmentation remarquable dans le domaine de l'intelligence...

AI

Les meilleures entreprises de sécurité résidentielle à surveiller en 2023

Sélectionner le système de sécurité domestique approprié peut être très intimidant. Dans cet article, nous vous guide...

Technologie de l'IA

Les principes d'IA à mettre en pratique

La mise en œuvre des principes d'IA garantit des technologies d'IA éthiques et technologiquement robustes. Consultez ...

AI

Se mettre en œuvre de la détection de transactions frauduleuses en utilisant les MLOPs

Introduction Dans le monde numérique d’aujourd’hui, les gens se tournent de plus en plus vers les transac...

AI

Équilibrer la technologie et l'esprit l'IA pour la santé mentale

Découvrez l'entrelacement de l'IA et de la santé mentale, dévoilant les bénéfices potentiels et les défis dans notre ...

AI

Comment les ressources humaines sont utilisées dans les systèmes de paie 4 exemples

En ce qui concerne la gestion d'entreprise, l'entrelacement des fonctions des ressources humaines et de la paie peut ...