Vous êtes sur la page 1sur 6

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- 959, bd de la 92547812 xyz@yahoo.fr
Doumasséssé Kara

Alognon Komi Tokoin- 900, bd de la 97455241 txyz@gmail.com


Doumasséssé Kara

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"
}
},
{
$out:" personnedocJointTmp "
}
])

Vous aimerez peut-être aussi