Académique Documents
Professionnel Documents
Culture Documents
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 ([
{ "$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
}
}
]);
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
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.
}
},
]).pretty()
- Affichage de la collection personnedoc
db.personnedoc.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 "
}
])