Vous êtes sur la page 1sur 24

23/02/24

Bases de données
NOSQL
LP SIBD
Pr. Youssef LEFDAOUI

Année Universitaire 2023 -2024

Pr Y.Lefdaoui NOSQL Slide 1

Bases de données
NOSQL
Frameworks mapreduce

Pr Y.Lefdaoui NOSQL Slide 57

1
23/02/24

Rappels : Notions et vocabulaire

Pr Y.Lefdaoui NOSQL Slide 58

Questions pour les phases


MapReduce :
● Phase Map
• Il faut être clair sur la nature des documents que l’on traite en entrée. D’où viennentils,
• Quelle est leur structure? Un traitement MapReduce s’applique à un flux de documents, on
ne peut rien faire si on ne sait pas en quoi ils consistent.
• Quels sont les groupes que je veux constituer? Combien y en atil? Comment les identifier
(valeur de clé identifiant un groupe, l’étiquette)?
• Comment déterminer le ou les étiquettes d’un ou de plusieurs groupes dans un document en
entrée?
• Quelles sont les valeurs intermédiaires que je veux produire à partir d’un document et placer
dans des groupes?
• Comment les produire à partir d’un document?
● Phase Reduse
• Pour la fonction de Reduce, c’est encore plus simple:
• Quelle est la nature de l’agrégation qui va prendre un groupe et produire une valeur finale?
• Et c’est tout, il reste à traduire en termes de programmation.

Pr Y.Lefdaoui NOSQL Slide 59

2
23/02/24

Les deux fonctions Map/Reduce


● Un traitement MapReduce se spécifie sous la forme de
deux fonctions :
• La fonction de Map prend toujours en entrée un (un seul)
document; elle produit toujours des paires (k, v) où k est
l’étiquette (la clé) du groupe et v la valeur intermédiaire.

• La fonction de Reduce prend toujours en entrée une paire (k,


list(v)), où k est l’étiquette (la clé) du groupe et list(v) la liste
des valeurs du groupe.

Pr Y.Lefdaoui NOSQL Slide 60

Exercice : l’aide alimentaire avec MapReduce

Une association reçoit des dons alimentaires en nature: boîtes de conserves,


céréales,
confitures, chocolat, etc. Ces dons arrivent en vrac, il faut que l’association
constitue des palettes de produits homogènes. Voici les catégories de produits:
céréales (riz, pâtes), légumes (secs), conserves, douceurs (chocolat, confitures,
etc.)

Expliquez une organisation MapReduce pour effectuer le conditionnement en


palette. Vérifiez que cette organisation est scalable: on peut s’adapter au flux des
dons en affectant plus ou moins de bénévoles aux tâches.

NB: vous pouvez faire un dessin expliquant l’organisation, avec quelques


explications.

Pr Y.Lefdaoui NOSQL Slide 61

3
23/02/24

commençons à parler informatique

Vous avez un ensemble de documents textuels, et vous voulez connaître la fréquence


d’utilisation de chaque mot. Si, par exemple, le mot « confiture » apparaît 1 fois dans le
document A, deux fois dans le document B et 1 fois dans le document C, vous voulez
obtenir (confiture, 4).
Quel est le processus Map Reduce qui prend en entrée les documents et fournit en sortie
les paires (mot, fréquence)? Décrivezle avec des petits dessins si vous voulez.
NB : ce genre de calcul est à la base de nombreux algorithmes d’analyse, et sert par
exemple à construire des moteurs de recherche.

Pr Y.Lefdaoui NOSQL Slide 62

Classons les fruits


On reçoit d’un fournisseur une livraison de fruits (pommes, ananas, oranges,
etc). On décide d’effectuer un test qualité en leur donnant 0 ou 1 pour les
critères suivants (trop mûr, tâché, déformé, etc).

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?

NB: ce genre d’indicateur permet de construire des classeurs pour reconnaître


automatiquement l’espèce d’un fruit (enfin, pour produire un indicateur de
probabilité d’appartenance à une espèce à une classe, avec choix de la classe la
plus probable).

Pr Y.Lefdaoui NOSQL Slide 63

4
23/02/24

Exemple

Pr Y.Lefdaoui NOSQL Slide 64

Pr Y.Lefdaoui NOSQL Slide 65

5
23/02/24

Pr Y.Lefdaoui NOSQL Slide 66

MapReduce et MongoDB

Pr Y.Lefdaoui NOSQL Slide 67

6
23/02/24

Exemple : regroupement de films

Pr Y.Lefdaoui NOSQL Slide 68

Le résultat

Pr Y.Lefdaoui NOSQL Slide 69

7
23/02/24

Les bases NoSQL orientées documents


Représentation des documents -JSON
Exemples de documents JSON
§ Document 1 : Objet composé de couples nom/valeur
{ "nom": "Dupont",
"prenom": "Jean",
"ville": "Paris",
}
§ Document 2 : avec un tableau de numéros de téléphone sous forme de chaînes de caractères
{ "nom": "Dupont",
"prenom": "Jean",
"ville": "Paris",
"telephone": [ "0612345678" , "0312345678" ]
}
§ Document 3: avec un tableau de numéros de téléphone sous forme de couples nom/valeur
{ "nom": "Dupont",
"prenom": "Jean",
"ville": "Paris",
"telephone": [{"mobile" : "0612345678"} , {"fax" : "0312345678" }]

Pr Y.Lefdaoui NOSQL Slide 70

Les bases NoSQL orientées documents


Représentation des documents - JSON

Document 4 : collection de couples nom/valeur, avec tableau


{
{ "Auteur" : { "Nom": "Dupont",
"Prénom": "Jean", }
}
"Titre" : "Le livre secret",
"Mots-clés" : ["Roman", "Policier"]
}
§Les documents structurés sont relativement riches en terme de représentation
§Structures complexes pouvant être imbriquées avec des agrégats, des listes et des tableaux
§Ils sont flexibles, par exemple on peut avoir ou non des mots-clés pour un livre, des notes,
etc.
§Ils s'auto-décrivent avec la gestion des couples nom/valeur.

Pr Y.Lefdaoui NOSQL Slide 71

8
23/02/24

Les bases NoSQL orientées documents


Représentation des documents -JSON

● Les documents structurés JSON peuvent être


vus comme des structures arborescentes

Arbre représentant un objet avec


une composition d'agrégats et
un tableau de valeurs (simples)

Pr Y.Lefdaoui NOSQL Slide 72

Modélisation Conception d'une


base de données relationnelle
§Principe de conception d'une base de données relationnelle
§Modélisation des informations
§Modèle conceptuel de données
§Modèle Entités-Associations, Modèle UML
§Modèle logique
§Spécification du schéma de la base –Définition des tables
§Modèle physique
§Implémentation de la base

§Caractéristiques du modèle relationnel


§Les données sont contraintes par un schéma
§La normalisation du schéma vise à éviter la redondance des données
§Toutes les entités sont considérées de façon similaire
§Le regroupement des données réparties dans les tables (qui comportent des clés
primaires et des clés étrangères) se fait en SQL à l'aide de jointure
Pr Y.Lefdaoui NOSQL Slide 73

9
23/02/24

Modélisation Conception d'une


base de données relationnelle
● Exemple : Extrait d'un modèle UML modélisant des
réservations de voiture dans des agences

Une société comporte une à plusieurs agences.


Une agence appartient à une société.

Une réservation concerne une voiture et a :


une agence de départ, une agence de d'arrivée,
une date de début et une date de fin.

Pr Y.Lefdaoui NOSQL Slide 74

Modélisation Conception d'une


base de données relationnelle
Le schéma relationnel
§Tables pour l'extrait de diagramme présenté
§Société (idS, nom)
§Voiture (numV, capacité, modèle, prix)
§Agence (numA, nom, adresse, numSociété)
§Réservation(numéro, nom, dateDébut, dateFin, numAD, numAA, numV)

§Insertion des données dans les tables


§En respect des contraintes d'intégrité
§Requêtes avec jointure : toutes les réservations avec les modèles
de voiture et le nom des agences
select r.numéro, r.nom, v.modèle, ad.nom, aa.nom
fromréservation r, agence ad, agence aa, voiture v
wherer.numV=v.numV
and r.numAA=aa.numAand r.numAD=ad.numA;

Pr Y.Lefdaoui NOSQL Slide 75

10
23/02/24

Modélisation Conception NoSQL


avec documents structurés
§Les bases de données orientées documents gèrent
§des documents structurés et des collections de documents
§Modélisation possible des données
§de façon arborescente, plus puissante que la modélisation tabulaire du
modèle relationnel
§Avec une représentation possible de liste de valeurs pour certaines
caractéristiques
§En reprenant l'exemple présenté, des réservations de
voiture, il est possible de structurer les informations
§Avec des documents qui décrivent l'ensemble des données d'une réservation

Pr Y.Lefdaoui NOSQL Slide 76

Modélisation Conception NoSQL avec documents structurés

Description d'un document pour une réservation


{ "numéro" : "123",
"nom":"resa123",
"dateD" : "12/10/2017,
"dateF" : "17/10/2017"
"agenceD" : { " numA" : "211",
"nom" : "DijonCentre",
"adresse" : "Dijon" },
"agenceA" : { " numA" : "331",
"nom" : "BordeauxCentre",
"adresse" : "Bordeaux"};
"voiture" : { "numV" : "666AA21",
"capacité : "5",
"modèle" : "Renault", "
prix : "200" }
}

Pr Y.Lefdaoui NOSQL Slide 77

11
23/02/24

Modélisation Conception NoSQL


avec documents structurés
● L'ensemble des informations concernant une réservation
• sont "regroupées"
● Et constitue une auto-description d'une réservation
● La manipulation de documents autonomes permet une gestion
des informations plus aisée dans un environnement distribué.
● Ces regroupements peuvent améliorer les performances pour
des collections de données massives.
• Mais pas de façon homogène selon les requêtes qui sont évaluées
● Par exemple, la représentation proposée en centrée sur les
réservations, qui sont décrites au niveau de la racine de
l'arborescence
• Les informations sur les agences concernées par les réservations sont imbriquées

Pr Y.Lefdaoui NOSQL Slide 78

Modélisation Conception NoSQL


avec documents structurés
● Les inconvénients liés à la modélisation avec des documents structurés
• Absence de vue "simple" des entités
» Ici les agences sont dans les réservations
• Ou nécessité de travailler avec d'autres documents pour avoir une connaissance
des agences
» Par exemple avec les société
● La non redondance des informations n'est plus assurée
• La description d'une même agence apparaît dans toutes les réservations concernées
par cette agence
● La structuration retenue dans les documents privilégie un certain usage
de la base de données
• Avec une connaissance "a priori"

Pr Y.Lefdaoui NOSQL Slide 79

12
23/02/24

Modélisation NoSQL et relationnel

● Les systèmes NoSQL ne comportent en général pas de schéma des


données
• Ou pas de façon similaire au schéma d'une BD relationnel
● Les systèmes NoSQL reportent un ensemble de contrôles au niveau des
applicatifs
• Pas de schéma, pas de contrôle d'intégrité sur les données
• Pas de gestion des transactions
● Les systèmes NoSQL sont plutôt adaptés pour des données
• peu structurées, comme des données graphe (ex : réseaux sociaux) , des séries
temporelles (ex: données de capteurs horadatées) , ou certaines données textuelles
(analyse de fichiers de log ou de messages d'erreur, etc.)
• qui nécessitent peu de mises à jour, mais des lectures avec des gros volumes
• nécessitant des traitements en temps réel (optimisation des temps de réponse)
● Les BD relationnelles et les Bases de données NoSQL sont
complémentaires et n'ont pas les mêmes objectifs
• Importance de réfléchir à la BD à utiliser selon les fonctionnalités des applicatifs à
développer et le type des données à traiter
Pr Y.Lefdaoui NOSQL Slide 80

La base de données orientée documents:


MongoDB Caractéristiques

● MongoDBest un système de gestion de


données NoSQL
• Orienté document, très populaire
• Développé par la société américaine MongoDBInc.
• Disponible depuis 2009
● §MongoDBest codé en C++
• Les documents sont codés en interne dans le format
BSON (BinarySerialized dOcument Notation ou Binary
JSON).
• Pour l'utilisateur les documents sont en format JSON
(JavaScript Object Notation)

Pr Y.Lefdaoui NOSQL Slide 81

13
23/02/24

La base de données orientée documents:


MongoDB Caractéristiques
● Les documents sont gérés dans des collections.
• Tous les documents d'une collection ne sont pas nécessairement identiques
● Chaque document est identifié par une clé unique dans une
collection
• Qui peut être comparée à la notion de clé primaire d'une table relationnel
• La clé d'un document porte un nom fixe : _id.
» Elle peut être fournie ou générée automatiquement (génération d'un UUID de type
ObjectId d'une taille de 96 octets)
● Les collections peuvent être regroupées dans des espaces de
noms et sont stockées dans des bases de données
» Une BD est une collection de collections
• Les bases de données sont créées "à la demande" lorsqu'elles sont mentionnées
dans une commande
● MongoDB autorise aussi le stockage d'objets larges ou de documents
binaires (avec BSON, ou GridFS pour les documents de plus grande
taille).

Pr Y.Lefdaoui NOSQL Slide 82

Bases de données
NOSQL
Frameworks Aggregation

Pr Y.Lefdaoui NOSQL Slide 83

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/

Pr Y.Lefdaoui NOSQL Slide 84

Pr Y.Lefdaoui NOSQL Slide 85

15
23/02/24

Pr Y.Lefdaoui NOSQL Slide 86

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"

{ "_id" : 1, "item" : "abc", "prix" : 10, "quantite" : 2, "date" : ISODate("2014-03-01T08:00:00Z") }


• Regroupement par mois, jour et année, et calcul du prix total et des quantités moyennes
● db.tests.aggregate( [

{$group : { _id : { mois: { $month: "$date" }, jour: { $dayOfMonth: "$date" }, an: { $year: "$date" } },
PrixTotal: { $sum: { $multiply: [ "$prix", "$quantite" ] } },
QuantiteMoyenne: { $avg: "$quantite" },
NombreObjets: { $sum: 1 } }
}
])

Pr Y.Lefdaoui NOSQL Slide 87

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 }

Pr Y.Lefdaoui NOSQL Slide 88

MongoDB–Framework d'agrégation
Les opérateurs d'agrégation

● L'opérateur $limit, limite le nombre de documents pour la suite de


la séquence de traitement
• db.tests.aggregate( { $limit: 5 } );
§Pas d'effet sur les documents passés

● L'opérateur $skip, permet de "sauter" n documents pour la suite


de la séquence de traitement, et transmet le reste des documents
• db.tests.aggregate( { $skip: 3 } );
● L'opérateur $match, permet de filtrer des documents à passer au
pipeline, selon une ou des conditions
§db.tests.aggregate( [ { $match : { auteur : "Dupont" } } ] );
§db.tests.aggregate( [ { $match: { $or: [ { score: { $gt: 70, $lt: 90 } }, { views: { $gte:
1000 } } ] } }] );

Pr Y.Lefdaoui NOSQL Slide 89

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

● L'opérateur $project, permet de mettre en forme les


documents avec les champs existants ou de nouveaux
champs, avant de les passer au pipeline
• { "_id" : 1, titre: "abc123", "isbn": "0001122223334", "auteurs":
{ last: "zzz", first: "aaa" }, "copies": 5 }
• db.tests.aggregate( [ { $project : { titre: 1 , auteurs : 1 } } ] )
• { "_id" : 1, "titre" : "abc123", "auteurs" : { "last" : "zzz", "first" :
"aaa" } }

Pr Y.Lefdaoui NOSQL Slide 90

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" } ] )

● le $push permetde regrouperles informationsdes titresdansun


tableau
● Résultat: collection "Auteurs"
• { "_id" : "Dante", "livres" : [ "The Banquet", "Divine Comedy", "Eclogues" ] }

Pr Y.Lefdaoui NOSQL Slide 91

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 } ] }

Pr Y.Lefdaoui NOSQL Slide 92

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.

Pr Y.Lefdaoui NOSQL Slide 93

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 }

● Recherche la moyenne de la population des villes par région


db.villes.aggregate( [
{ $group: { _id: { Region: "$Region", Ville: "$Ville" }, pop: { $sum: "$Population" } } },
{ $group: { _id: "$_id.Region", avgVillePop: { $avg: "$pop" } } }
])

● Le 1er$group regroupe les documents selon la région et la ville et


calcule la population pour chaque combinaison
{ "_id" : { "Region" : "Bourgogne", "Ville" : "DIJON" }, "pop" : 150000 }

● Le 2ème$group calcule la moyenne par région


● Résultat
{ "_id" : "Bourgogne", "avgVillePop" : 18500 }
Pr Y.Lefdaoui NOSQL Slide 94

MongoDB–Framework
d'agrégation Requêtes avancées

Pr Y.Lefdaoui NOSQL Slide 95

20
23/02/24

MongoDB–Framework d'agrégation
Requêtes avancées

● Résultat de la requête

{ "VilleLaPlusGrande" : { "nom" : "DIJON",


"PopulationLaPlusGrande" : 150000 },
"VilleLaPlusPetite" : { "nom" : "BEAUNE",
"PopulationLaPlusPetite" : 22000 },
"Region" : "Bourgogne"
}

Pr Y.Lefdaoui NOSQL Slide 96

Pr Y.Lefdaoui NOSQL Slide 97

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" },

{ "_id" : "apples", "value" : { "count" : 4, "qty" : 35, "avg" : 8.75 } }


{ "_id" : "carrots", "value" : { "count" : 2, "qty" : 15, "avg" : 7.5 } }
{ "_id" : "chocolates", "value" : { "count" : 3, "qty" : 15, "avg" : 5 } }
{ "_id" : "oranges", "value" : { "count" : 7, "qty" : 63, "avg" : 9 } }
{ "_id" : "pears", "value" : { "count" : 1, "qty" : 10, "avg" : 10 } }

Pr Y.Lefdaoui NOSQL Slide 98

Return the Total Price Per Customer


● Return the Total Price Per Customer
Perform the map-reduce operation on the orders collection to group by the cust_id, and
calculate the sum of the price for each cust_id:

var mapFunction1 = function() {


emit(this.cust_id, this.price);
};

var reduceFunction1 = function(keyCustId, valuesPrices) {


return Array.sum(valuesPrices);
};

db.orders.mapReduce(
mapFunction1,
reduceFunction1,
{ out: "map_reduce_example" }
)

db.map_reduce_example.find().sort( { _id: 1 } )

Pr Y.Lefdaoui NOSQL Slide 99

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.

● The operation in the example:

• 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.

Pr Y.Lefdaoui NOSQL Slide 100

Solution sku: "oranges",


sku: "apples",
db.orders.insertMany([ sku: "oranges",
{ _id: 1, cust_id: "Ant O. Knee", ord_date: new Date("2020-03-01"), price: 25, items: sku: "chocolates",
[ { sku: "oranges", qty: 5, price: 2.5 }, { sku: "apples", qty: 5, price: 2.5 } ], status: "A" }, sku: "oranges",
{ _id: 2, cust_id: "Ant O. Knee", ord_date: new Date("2020-03-08"), price: 70, items: sku: "pears",
[ { sku: "oranges", qty: 8, price: 2.5 }, { sku: "chocolates", qty: 5, price: 10 } ], status: "A" }, sku: "oranges",
{ _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" }, sku: "oranges", [ {coun
var mapFunction2 = function() {
for (var idx = 0; idx < this.items.length; idx++) {
var key = this.items[idx].sku;
var value = { count: 1, qty: this.items[idx].qty };

emit(key, value);
}
}; Pr Y.Lefdaoui NOSQL Slide 101

23
23/02/24

var reduceFunction2 = function(keySKU, countObjVals) {


reducedVal = { count: 0, qty: 0 };

for (var idx = 0; idx < countObjVals.length; idx++) {


reducedVal.count += countObjVals[idx].count;
reducedVal.qty += countObjVals[idx].qty;
}

return reducedVal;
};

Pr Y.Lefdaoui NOSQL Slide 102

var finalizeFunction2 = function (key, reducedVal) {


reducedVal.avg = reducedVal.qty/reducedVal.count;
return reducedVal;
};

db.orders.mapReduce(
mapFunction2,
reduceFunction2,
{
out: { merge: "map_reduce_example2" },
query: { ord_date: { $gte: new Date("2020-03-01") } },
finalize: finalizeFunction2
}
);

Pr Y.Lefdaoui NOSQL Slide 103

24

Vous aimerez peut-être aussi