Académique Documents
Professionnel Documents
Culture Documents
Bases de données
NOSQL
LP SIBD
Pr. Youssef LEFDAOUI
Bases de données
NOSQL
Frameworks mapreduce
1
23/02/24
2
23/02/24
3
23/02/24
Pour chaque espèce de fruit, on veut calculer la proportion de fruits trop mûrs.
Comment faire avec MapReduce?
On veut faire le même calcul pour tous les critères. Comment faire?
4
23/02/24
Exemple
5
23/02/24
MapReduce et MongoDB
6
23/02/24
Le résultat
7
23/02/24
8
23/02/24
9
23/02/24
10
23/02/24
11
23/02/24
12
23/02/24
13
23/02/24
Bases de données
NOSQL
Frameworks Aggregation
14
23/02/24
MongoDB–Framework d'agrégation
● Depuis la version 2.2, MongoDB propose
• un frameworkd'agrégation (aggregationframework)
§pour réaliser des opérations complexes d'analyse
§qui permet de récupérer et manipuler les données dans mongoDB,
§Sans utiliser des traitements complexes en batch avec Map/Reduce
§Il fournit des opérateurs comme $group, $limit, $match, $sort, $unwind,
$project, $skip, $out, $redact, $ lookup, etc.
§https://docs.mongodb.com/manual/reference/operator/aggregation/index.html
§Pour regrouper les données et les manipuler en créant un "pipeline"
d'agrégation
§db.collection.aggregate( [ { … }, { …}, ... ] )
§https://docs.mongodb.com/manual/aggregation/
15
23/02/24
MongoDB–Framework d'agrégation
● L'opérateur $group permet
• de regrouper les entrées d'un document, selon une expression donnée,
• d'effectuer des cumuls si besoin
● Exemple : collection "tests"
{$group : { _id : { mois: { $month: "$date" }, jour: { $dayOfMonth: "$date" }, an: { $year: "$date" } },
PrixTotal: { $sum: { $multiply: [ "$prix", "$quantite" ] } },
QuantiteMoyenne: { $avg: "$quantite" },
NombreObjets: { $sum: 1 } }
}
])
16
23/02/24
MongoDB–Framework d'agrégation
Les opérateurs d'agrégation
● Collection
• db.tests.insertOne({ "_id" : 1, "item" : "abc", "prix" : 10,
"quantite" : 2, "date" : ISODate("2014-03-01T08:00:00Z") })
• db.tests.insertOne({ "_id" : 2, "item" : "abc", "prix" : 10,
"quantite" : 2, "date" : ISODate("2014-03-01T08:00:00Z") })
• db.tests.insertOne({ "_id" : 3, "item" : "abc", "prix" : 10,
"quantite" : 2, "date" : ISODate("2015-03-01T08:00:00Z") })
● Résultat
• { "_id" : { "mois" : 3, "jour" : 1, "an" : 2015 }, "PrixTotal" :
20, "QuantiteMoyenne" : 2, " NombreObjets" : 1 }
• { "_id" : { "mois" : 3, "jour" : 1, "an" : 2014 }, "PrixTotal" :
40, "QuantiteMoyenne" : 2, " NombreObjets" : 2 }
MongoDB–Framework d'agrégation
Les opérateurs d'agrégation
17
23/02/24
MongoDB–Framework d'agrégation
Les opérateurs d'agrégation
● L'opérateur $sort, trie les documents et les transmet
de façon ordonnée au pipeline
• db.tests.aggregate( [ { $sort : { age: -1 } }] )
§1 = ordre croissant, -1 décroissant
MongoDB–Framework d'agrégation
Les opérateurs d'agrégation
● L'opérateur $out permet de créer une collection avec le résultat
d'un pipeline
● Exemple de documents d'une collection "Livres"
• §{ "_id" : 8751, "titre" : "The Banquet", "auteur" : "Dante", "copies" : 2 }
• §{ "_id" : 8752, "titre" : "Divine Comedy", "auteur" : "Dante", "copies" : 1 }
● Regroupementdes titrespour un auteur, et
créationd'unecollection "Auteurs"
• §db.livres.aggregate( [ { $group : { _id : "$auteur", "livres": { $push: "$titre" } } },
{ $out : "authors" } ] )
18
23/02/24
MongoDB–Framework d'agrégation
Les opérateurs d'agrégation
● L'opérateur $lookup, permet de faire une "jointure" entre des objets de deux collections,
● Exemple
§Collection "articles
{ "_id" : 1, "article" : "abc", "prix" : 12, "quantite" : 2 }
§Collection inventaire
{ "_id" : 1, "unite" : "abc", description: "produit1", "stock" : 120 }
§db.articles.aggregate([ { $lookup:
{ from: "articles",
localField: "article",
foreignField: "unite",
as: "inventaires_docs" } } ])
● Résultat
• { "_id" : 1, "article" : "abc", "prix" : 12, "quantite" : 2, "inventaires_docs" :
[ { "_id" : 1, "unité" : "abc", description: "produit 1", "stock" : 120 } ] }
MongoDB–Framework d'agrégation
Requêtes avancées
● Exemple de document
• { "_id": "21000", "Ville": "DIJON", "Region": "Bourgogne",
"Population": 15000, "gps": [47.316667, 5.016667 ] }
● Recherche des régions dont la population est
supérieureà 1 million
• db.villes.aggregate( [ { $group: { _id: "$Region", totalPop: { $sum:
"$population" } } }, { $match: { totalPop: { $gte: 1000*1000 } } } ] )
§$group regroupe les documents selon la région, calcule le total de la
population (avec $sum)
§ et fournit un document unique pour chaque région
§ $match filtre les documents dont la valeur de la population totale est
supérieure à 1000000.
19
23/02/24
MongoDB–Framework d'agrégation
Requêtes avancées
● Exemple de document
{ "_id": "21000", "Ville": "DIJON", "Region": "Bourgogne", "Population": 150000, "gps": [47.316667,
5.016667 ] }
{ "_id": "21000", "Ville": "BEAUNE", "Region": "Bourgogne", "Population": 60000 }
MongoDB–Framework
d'agrégation Requêtes avancées
20
23/02/24
MongoDB–Framework d'agrégation
Requêtes avancées
● Résultat de la requête
21
23/02/24
Exemple :
Calcul des quantites des articles à partir d'une collection
de commandes (Orders)
db.orders.insertMany([
{ _id: 1, cust_id: "Ant O. Knee", ord_date: new Date("2020-03-01"), price: 25, items: [ { sku: "oranges", qty: 5, price:
2.5 }, { sku: "apples", qty: 5, price: 2.5 } ], status: "A" },
{ _id: 2, cust_id: "Ant O. Knee", ord_date: new Date("2020-03-08"), price: 70, items: [ { sku: "oranges", qty: 8, price:
2.5 }, { sku: "chocolates", qty: 5, price: 10 } ], status: "A" },
{ _id: 3, cust_id: "Busby Bee", ord_date: new Date("2020-03-08"), price: 50, items: [ { sku: "oranges", qty: 10, price:
2.5 }, { sku: "pears", qty: 10, price: 2.5 } ], status: "A" },
{ _id: 4, cust_id: "Busby Bee", ord_date: new Date("2020-03-18"), price: 25, items: [ { sku: "oranges", qty: 10, price:
2.5 } ], status: "A" },
db.orders.mapReduce(
mapFunction1,
reduceFunction1,
{ out: "map_reduce_example" }
)
db.map_reduce_example.find().sort( { _id: 1 } )
22
23/02/24
Calculate Order and Total Quantity with Average Quantity Per Item
● In the following example, you will see a map-reduce operation on the orders collection for all documents that have an
ord_date value greater than or equal to 2020-03-01.
• Groups by the item.sku field, and calculates the number of orders and the total quantity ordered for each sku.
• Calculates the average quantity per order for each sku value and merges the results into the output collection.
● When merging results, if an existing document has the same key as the new result, the operation
overwrites the existing document. If there is no existing document with the same key, the operation
inserts the document.
emit(key, value);
}
}; Pr Y.Lefdaoui NOSQL Slide 101
23
23/02/24
return reducedVal;
};
db.orders.mapReduce(
mapFunction2,
reduceFunction2,
{
out: { merge: "map_reduce_example2" },
query: { ord_date: { $gte: new Date("2020-03-01") } },
finalize: finalizeFunction2
}
);
24