MongoDB – Transformations¶
$arrayElemAt (aggregation)¶
- Permet de sélectionner un élément dans un tableau :
- Exemple :
db.users.aggregate([
{
$project:
{
name: 1,
first: { $arrayElemAt: [ "$favorites", 0 ] }, // 0: premier élément
last: { $arrayElemAt: [ "$favorites", -1 ] } // -1: dernier élément
}
}
])
Documents de la collection users :
{ "_id" : 1, "name" : "dave123", favorites: [ "chocolate", "cake", "butter", "apples" ] }
{ "_id" : 2, "name" : "li", favorites: [ "apples", "pudding", "pie" ] }
{ "_id" : 3, "name" : "ahn", favorites: [ "pears", "pecans", "chocolate", "cherries" ] }
{ "_id" : 4, "name" : "ty", favorites: [ "ice cream" ] }
Exercice
Trouvez le premier score de chaque restaurant.
Équivalent du HAVING de MySQL¶
- Il est parfois nécessaire de filtrer les éléments groupés en fonction de la valeur obtenue par la fonction statistique (nombre, somme, moyenne).
- Exemple : https://docs.mongodb.com/manual/reference/operator/aggregation/group/#group-by-item-having
db.sales.aggregate(
[
// Première étape
{
$group :
{ _id : "$item",
totalSaleAmount: { $sum: { $multiply: [ "$price", "$quantity" ] } }}
},
// Deuxième étape
{
$match: { "totalSaleAmount": { $gte: 100 } }
}
]
)
Regroupement de toutes les données¶
- Si l’on désire obtenir une fonction statistique (nombre, somme, moyenne, etc.) pour l’ensemble des données, il faut spécifier un
_idconstant - La convention est d’utiliser
null. - Exemple : https://docs.mongodb.com/manual/reference/operator/aggregation/group/#group-by-null
db.sales.aggregate([
{
$group : {
_id : null,
totalSaleAmount: { $sum: { $multiply: [ "$price", "$quantity" ] } },
averageQuantity: { $avg: "$quantity" },
count: { $sum: 1 }
}
}
])
Regroupement par champs multiples¶
- On peut regrouper l’information à l’aide de plusieurs champs (index composite).
- Exemple : Nombre de restaurants par district (borough) et type de cuisine
db.restaurants.aggregate([
{
$group:
{
_id: {borough: "$borough", cuisine: "$cuisine"},
nbRestos: { $sum : 1}
}
},
{
$sort: {_id:1}
}
])
{ _id: { borough: 'Bronx', cuisine: 'African' }, nbRestos: 31 },
{ _id: { borough: 'Bronx', cuisine: 'American' }, nbRestos: 411 },
{ _id: { borough: 'Bronx', cuisine: 'Armenian' }, nbRestos: 2 },
{ _id: { borough: 'Bronx', cuisine: 'Asian' }, nbRestos: 4 },
{ _id: { borough: 'Bronx', cuisine: 'Bagels/Pretzels' }, nbRestos: 3 },
{ _id: { borough: 'Bronx', cuisine: 'Bakery' }, nbRestos: 71 },
{ _id: { borough: 'Bronx', cuisine: 'Bangladeshi' }, nbRestos: 5 },
{ _id: { borough: 'Bronx', cuisine: 'Barbecue' }, nbRestos: 2 },
Requêtes pivot¶
- Il est également possible d’effectuer des analyses croisées (“pivot”).
- Exemple : https://docs.mongodb.com/manual/reference/operator/aggregation/group/#pivot-data
Documents de départ (collection books) :
{ "_id" : 8751, "title" : "The Banquet", "author" : "Dante", "copies" : 2 },
{ "_id" : 8752, "title" : "Divine Comedy", "author" : "Dante", "copies" : 1 },
{ "_id" : 8645, "title" : "Eclogues", "author" : "Dante", "copies" : 2 },
{ "_id" : 7000, "title" : "The Odyssey", "author" : "Homer", "copies" : 10 },
{ "_id" : 7020, "title" : "Iliad", "author" : "Homer", "copies" : 10 }
Résultat :
{ "_id" : "Homer", "books" : [ "The Odyssey", "Iliad" ] }
{ "_id" : "Dante", "books" : [ "The Banquet", "Divine Comedy", "Eclogues" ] }
- La requête nous a permis de “pivoter” de documents “livres” (books) vers des documents “auteurs” (authors)
- La même information est disponible, mais est maintenant centrée sur les auteurs
$groupavec un$pushnous amène d’une relation Many-to-One vers un One-To-Many- L’opérateur
$unwindpermet l’opération contraire :
Tutoriels de MongoDB sur aggregate()¶
$groupet fonctions statistiques$unwindsuivi de$group
Échantillons de données¶
- Voici d’autres échantillons de données fournis par MongoDB que nous utiliserons dans les prochaines semaines :
sample_airbnbsample_mflix
Pour accéder aux données :
Utiliser l’environnement cloud et charger le lot de données : https://www.mongodb.com/docs/manual/sample-data/

MongoDB University¶
- MongoDB University est une plateforme en ligne permettant d’apprendre de solides bases sur ce SGBD.
- Nous suivrons partiellement cette formation: https://learn.mongodb.com/courses/mongodb-aggregation