Chapitre 9 : Fonction ‘aggregat’ dans base de données NoSQL 1. Introduction En
Chapitre 9 : Fonction ‘aggregat’ dans base de données NoSQL 1. Introduction En NoSQL le principe de clé secondaire n'est pas comme dans le SQL classique. Il arrive parfois de sélectionner des informations conjointes entre deux documents. Comment peut on procéder? 2. Syntaxe db.post.aggregate ([ { "$match": { "rating": "important" } }, { "$sort": { "date": -1 } }, { "$limit": 20 }, { "$lookup": { "localField": "user_id", "from": "user", "foreignField": "_id", "as": "userinfo" } }, { "$unwind": "$userinfo" }, { "$project": { "text": 1, "date": 1, "userinfo.name": 1, "userinfo.country": 1 } } ]); Explication des opérateurs from: la collection à rejoindre localField: le champ de recherche dans le document d'entrée foreignField: le champ à rechercher dans la collection from as: le nom du fichier de sortie Le $match permet de spécifier la comparaison = ou autre. Le nom du champ à comparer est rating dans l'exemple et la valeur de comparaison est ‘important’ l'opérateur $unwind pour le déconstruire en un sous-document 3. Exercice d'application Personne Nom Prenom Quartier Rue Contact Tel Email Kokou Amen Tokoin- Doumasséssé 959, bd de la Kara 92547812 xyz@yahoo.fr Alognon Komi Tokoin- Doumasséssé 900, bd de la Kara 97455241 txyz@gmail.com a- Proposez pour cette représentation relationnelle suivante deux possibilité de représentation NoSQL b- Choisissez la représentation avec possibilité de ‘Migration de clé’ et utilisez la fonction aggregat pour Afficher les informations du tableau. Proposition de correction a- Représentation NoSQL Proposition 1 personne1{ id:object_id("012508472211"), nom:"Kokou", prenom:"Amen", quartier:"Tokoin-Doumasséssé", Rue:"959, bd de la Kara", contact:{ tel:"92547812", email:"xyz@yahoo.fr" } } personne2{ id:object_id("032508472211"), nom:" 900, bd de la Kara Alognon", prenom":"Komi", quartier:"Tokoin-Doumasséssé", Rue:" "}, contact:{ tel:"97455241", email:"txyz@gmail.com" } } Proposition 2 personne1{ id:object_id("012508472211"), nom:"Kokou", prenom:"Amen", quartier1_id:"5032508472211", Rue:"959, bd de la Kara", contact:{ tel:"92547812", email:"xyz@yahoo.fr" } } personne2{ id:object_id("032508472211"), nom:"Alognon", prenom":"Komi", quartier1_id:"5032508472211", Rue:"900, bd de la Kara"}, contact:{ tel:"97455241", email:"txyz@gmail.com" } } quartier1{ id:object_id("5032508472211"), quartier:"Tokoin-Doumasséssé" } quartier2{ id:object_id("3032508472211"), quartier:"Agoè-Nyivé" } N.B : On utilisera souvent la première méthode si on privilégie l'intégrité des données sur la rapidité d'accès. b- Utilisation de la fonction ‘aggregat’ - Création de collection pour la proposition 1 use tp_iai db.personnedoc.insert({nom:"Kokou",prenom:"Amen",quartier:"Tokoin-Doumasséssé", rue:"959, bd de la Kara", contact:{tel:"92547812",email:"xyz@yahoo.fr"} }) db.personnedoc.insert({nom:"Alognon",prenom:"Komi",quartier:"Tokoin-Doumasséssé", rue:"900, bd de la Kara", contact:{tel:"97455241",email:"txyz@gmail.com"} }) - Création de collection pour la proposition 2 db.quartier.insert({code:"AN",libquartier:"Agoè-Nyivé"}) db.quartier.insert({code:"TD",libquartier:"Tokoin-Doumasséssé"}) db.personneTemp.insert({nom:"Kokou",prenom:"Amen",quartier_code:"TD", rue:"959, bd de la Kara", contact:{tel:"92547812",email:"xyz@yahoo.fr"} }) db.personneTemp.insert({nom:"Alognon",prenom:"Komi",quartier_code:"TD", rue:"900, bd de la Kara", contact:{tel:"97455241",email:"txyz@gmail.com"} }) Nous avons une relation un à plusieurs entre le personneTemp.quartier_code et le quartier.code. Nous pouvons utiliser l'opérateur $unwind pour le déconstruire en un sous-document: Exemple: $unwind:"$personnedocJoint" Enfin, nous pouvons renvoyer les informations dans $projet - Jointure à base de la proposition 2 db.personneTemp.aggregate([ {$lookup: { from: "quartier", localField: "quartier_code", foreignField: "code", as: "personnedocJoint" } }, { $unwind:"$personnedocJoint" }, { $project:{ "_id":1, "nom" : 1, "prenom" : 1, "rue" : 1, "quartier" :"$personnedocJoint.libquartier", "contact.tel" : 1, "contact.email" : 1, } }, ]).pretty() - Affichage de la collection personnedoc db.personnedoc.find().pretty() - Création de collection pour enregistrer le résultat de la jointure Avant de créer personnedocJointTmp, le 1er lot de commande à fait l'affichage. Le 2eme lot on va ajouter { $out:"personnedocJointTmp" } pour le créer. Ainsi le 2eme lot n’affichera plus. Pour consulter il faut faire db.personnedocJointTmp.find().pretty() db.personneTemp.aggregate([ {$lookup: { from: "quartier", localField: "quartier_code", foreignField: "code", as: "personnedocJoint" } }, { $unwind:"$personnedocJoint" }, { $project:{ "_id":1, "nom" : 1, "prenom" : 1, "quartier" :"$personnedocJoint.quartier" } }, { - Affichage de la collection personnedoc db.personnedoc.find().pretty() - Création de collection pour enregistrer le résultat de la jointure Avant de créer personnedocJointTmp, le 1er lot de commande à fait l'affichage. Le 2eme lot on va ajouter { $out:"personnedocJointTmp" } pour le créer. Ainsi le 2eme lot n’affichera plus. Pour consulter il faut faire db.personnedocJointTmp.find().pretty() db.personneTemp.aggregate([ {$lookup: { from: "quartier", localField: "quartier_code", foreignField: "code", as: "personnedocJoint" } }, { $unwind:"$personnedocJoint" }, { $project:{ "_id":1, "nom" : 1, "prenom" : 1, "quartier" :"$personnedocJoint.quartier" } }, { - Affichage de la collection personnedoc db.personnedoc.find().pretty() - Création de collection pour enregistrer le résultat de la jointure Avant de créer personnedocJointTmp, le 1er lot de commande à fait l'affichage. Le 2eme lot on va ajouter { $out:"personnedocJointTmp" } pour le créer. Ainsi le 2eme lot n’affichera plus. Pour consulter il faut faire db.personnedocJointTmp.find().pretty() db.personneTemp.aggregate([ {$lookup: { from: "quartier", localField: "quartier_code", foreignField: "code", as: "personnedocJoint" } }, { $unwind:"$personnedocJoint" }, { $project:{ "_id":1, "nom" : 1, "prenom" : 1, "quartier" :"$personnedocJoint.quartier" } }, { $out:" personnedocJointTmp " } ]) $out:" personnedocJointTmp " } ]) $out:" personnedocJointTmp " } ]) uploads/S4/ chapitre-9-fonction-aggregat-dans-base-de-donnees-nosql.pdf