Travaux dirigés
Utiliser l'environnement Docker MongoDB
docker compose run --rm --entrypoint validate.sh mongo-tools /import/bikes
docker compose run --rm mongo-tools tpinfo items /import/bikes
1. Découverte de la collection
- Combien de vélos contient la collection
items?
db.getCollection('items').countDocuments();
- Afficher un document de la collection
items(vélos).
db.getCollection('items').findOne();
Résultat
{
_id: ObjectId('6a911c1d3e43e8de87c0d018'),
'@context': 'https://schema.org',
'@type': 'Product',
additionalProperty: {
genre: 'Mixte',
groupe: {
manufacturer: {
'@type': 'Organization',
name: 'Shimano'
},
name: 'Shimano XT 12V'
},
'matière du cadre': 'Aluminium'
},
categories: [
'VTT Tout Suspendu'
],
description: 'Le Fuel EX 8 est un vélo de trail réglé pour les pilotes qui se lancent à fond dans les descentes accidentées et qui veulent un vélo qui la ramènera au sommet en pédalant sans broncher pour repartir pour un tour. Il possède un cadre en alliage d’aluminium solide et une transmission Shimano XT améliorée pour des changements de vitesse précis et fluide. La fourche Fox Rhythm de 150 mm gère sans difficultés les pierres et les racines tandis que l’amortisseur Fox Float X vous laisse au commande. Le nouvel espace de rangement dans le cadre et la géométrie réglable vous permettent de profiter de tous les avantages du modèle en carbone, mais à une fraction du prix.\r\n\r\nVous voulez un vélo de trail tout suspendu qui accorde la priorité à la suspension et aux performances de changement de vitesse par rapport à un cadre en carbone plus cher.\r\n\r\nUn cadre en alliage d’aluminium léger et rigide avec une fourche Fox Rhythm affichant un débattement de 150 mm avec ressort pneumatique Float Evol et amortisseur Grip pour les petites bosses et un amortisseur arrière Fox Performance Float X. Une transmission Shimano XT 12 vitesses pour des changements de vitesse vifs et des roues Bontrager Tubeless Ready. Sans oublier une nouvelle géométrie réglable qui vous laisse décider de la configuration.\r\n\r\nLe pilote qui ne veut pas être contraint sur le trail trouvera dans le Fuel EX 8 un compagnon prêt à tout. Sa géométrie trail progressive est conçue pour vous permettre de rouler à fond et les composants de niveau supérieur sont la cerise sur le gâteau.',
geometries: [
{
'angle de direction': {
'@type': 'QuantitativeValue',
unitCode: 'DD',
value: Double('64.5')
},
'angle tube de selle': {
'@type': 'QuantitativeValue',
unitCode: 'DD',
value: Double('70.8')
},
'douille de direction': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('95')
},
empattement: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('1145')
},
'longueur base': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('435')
},
reach: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('400')
},
stack: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('717')
},
'taille cadre': 'XS',
'taille des roues': {
'@type': 'QuantitativeValue',
unitCode: 'INH',
value: Double('27.5')
},
'tube de selle': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('360')
},
'tube supérieur': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('516')
}
},
{
'angle de direction': {
'@type': 'QuantitativeValue',
unitCode: 'DD',
value: Double('64.5')
},
'angle tube de selle': {
'@type': 'QuantitativeValue',
unitCode: 'DD',
value: Double('70.8')
},
'douille de direction': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('95')
},
empattement: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('1175')
},
'longueur base': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('435')
},
reach: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('430')
},
stack: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('724')
},
'taille cadre': 'S',
'taille des roues': {
'@type': 'QuantitativeValue',
unitCode: 'INH',
value: Double('27.5')
},
'tube de selle': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('380')
},
'tube supérieur': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('551')
}
},
{
'angle de direction': {
'@type': 'QuantitativeValue',
unitCode: 'DD',
value: Double('64.5')
},
'angle tube de selle': {
'@type': 'QuantitativeValue',
unitCode: 'DD',
value: Double('70.8')
},
'douille de direction': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('95')
},
empattement: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('1186')
},
'longueur base': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('435')
},
reach: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('425')
},
stack: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('737')
},
'taille cadre': 'S',
'taille des roues': {
'@type': 'QuantitativeValue',
unitCode: 'INH',
value: NumberInt('29')
},
'tube de selle': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('380')
},
'tube supérieur': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('554')
}
},
{
'angle de direction': {
'@type': 'QuantitativeValue',
unitCode: 'DD',
value: Double('64.5')
},
'angle tube de selle': {
'@type': 'QuantitativeValue',
unitCode: 'DD',
value: Double('70.8')
},
'douille de direction': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('100')
},
empattement: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('1213')
},
'longueur base': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('435')
},
reach: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('450')
},
stack: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('737')
},
'taille cadre': 'M',
'taille des roues': {
'@type': 'QuantitativeValue',
unitCode: 'INH',
value: NumberInt('29')
},
'tube de selle': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('410')
},
'tube supérieur': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('584')
}
},
{
'angle de direction': {
'@type': 'QuantitativeValue',
unitCode: 'DD',
value: Double('64.5')
},
'angle tube de selle': {
'@type': 'QuantitativeValue',
unitCode: 'DD',
value: Double('70.8')
},
'douille de direction': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('100')
},
empattement: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('1233')
},
'longueur base': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('440')
},
reach: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('470')
},
stack: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('742')
},
'taille cadre': 'M/L',
'taille des roues': {
'@type': 'QuantitativeValue',
unitCode: 'INH',
value: NumberInt('29')
},
'tube de selle': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('420')
},
'tube supérieur': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('607')
}
},
{
'angle de direction': {
'@type': 'QuantitativeValue',
unitCode: 'DD',
value: Double('64.5')
},
'angle tube de selle': {
'@type': 'QuantitativeValue',
unitCode: 'DD',
value: Double('70.8')
},
'douille de direction': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('105')
},
empattement: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('1250')
},
'longueur base': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('440')
},
reach: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('485')
},
stack: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('748')
},
'taille cadre': 'L',
'taille des roues': {
'@type': 'QuantitativeValue',
unitCode: 'INH',
value: NumberInt('29')
},
'tube de selle': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('435')
},
'tube supérieur': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('627')
}
},
{
'angle de direction': {
'@type': 'QuantitativeValue',
unitCode: 'DD',
value: Double('64.5')
},
'angle tube de selle': {
'@type': 'QuantitativeValue',
unitCode: 'DD',
value: Double('70.8')
},
'douille de direction': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('120')
},
empattement: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('1287')
},
'longueur base': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('445')
},
reach: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('515')
},
stack: {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('767')
},
'taille cadre': 'XL',
'taille des roues': {
'@type': 'QuantitativeValue',
unitCode: 'INH',
value: NumberInt('29')
},
'tube de selle': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('470')
},
'tube supérieur': {
'@type': 'QuantitativeValue',
unitCode: 'MMT',
value: NumberInt('662')
}
}
],
image: 'https://product-cdn-frz.alltricks.com/medium/6/434006/2434006/4660522',
manufacturer: {
'@type': 'Organization',
name: 'Trek'
},
model: {
brand: 'Trek',
family: 'Fuel EX',
range: '8',
generation: '5'
},
colors: [
'Gris Galactique / Noir',
'Matte Pennyflake / Orange'
],
name: 'VTT Tout Suspendu Trek Fuel EX 8 Shimano XT 12V 29″ Gris Galactique / Noir 2023',
offers: [
{
'@type': 'Offer',
color: 'Gris Galactique / Noir',
mpn: '5272045',
price: Double('3199.99'),
priceCurrency: 'EUR',
seller: {
'@type': 'Organization',
name: 'Alltricks'
},
sku: '2457035',
stock: NumberInt('1'),
taille: 'M / 165-177 cm',
url: 'https://www.alltricks.fr/F-11947-velos-complets-vtt/P-2471562-vtt_tout_suspendu_trek_fuel_ex_8_shimano_xt_12v_29___gris_galactique___noir_2023'
},
{
'@type': 'Offer',
color: 'Gris Galactique / Noir',
mpn: '5272046',
price: Double('3199.99'),
priceCurrency: 'EUR',
seller: {
'@type': 'Organization',
name: 'Alltricks'
},
sku: '2456918',
stock: NumberInt('51'),
taille: 'M-L / 173-180 cm',
url: 'https://www.alltricks.fr/F-11947-velos-complets-vtt/P-2471562-vtt_tout_suspendu_trek_fuel_ex_8_shimano_xt_12v_29___gris_galactique___noir_2023'
},
{
'@type': 'Offer',
color: 'Gris Galactique / Noir',
mpn: '5272047',
price: Double('3199.99'),
priceCurrency: 'EUR',
seller: {
'@type': 'Organization',
name: 'Alltricks'
},
sku: '2456921',
stock: NumberInt('51'),
taille: 'L / 177-188 cm',
url: 'https://www.alltricks.fr/F-11947-velos-complets-vtt/P-2471562-vtt_tout_suspendu_trek_fuel_ex_8_shimano_xt_12v_29___gris_galactique___noir_2023'
},
{
'@type': 'Offer',
color: 'Gris Galactique / Noir',
mpn: '5272048',
price: Double('3199.99'),
priceCurrency: 'EUR',
seller: {
'@type': 'Organization',
name: 'Alltricks'
},
sku: '2364334',
stock: NumberInt('51'),
taille: 'XL / 188-196 cm',
url: 'https://www.alltricks.fr/F-11947-velos-complets-vtt/P-2471562-vtt_tout_suspendu_trek_fuel_ex_8_shimano_xt_12v_29___gris_galactique___noir_2023'
},
{
'@type': 'Offer',
color: 'Matte Pennyflake / Orange',
gtin13: '601842739761',
mpn: '5272055',
price: Double('3032.31'),
priceCurrency: 'EUR',
seller: {
'@type': 'Organization',
name: 'Alltricks'
},
sku: '2457036',
stock: NumberInt('10'),
taille: 'L / 177-188 cm',
url: 'https://www.alltricks.fr/F-11947-velos-complets-vtt/P-2555635-vtt_tout_suspendu_trek_fuel_ex_8_shimano_xt_12v_29___matte_pennyflake___orange_2023'
},
{
'@type': 'Offer',
color: 'Matte Pennyflake / Orange',
mpn: '5272054',
price: NumberInt('4059'),
priceCurrency: 'EUR',
seller: {
'@type': 'Organization',
name: 'Alltricks'
},
sku: '2456893',
stock: NumberInt('51'),
taille: 'M-L / 173-180 cm',
url: 'https://www.alltricks.fr/F-11947-velos-complets-vtt/P-2555635-vtt_tout_suspendu_trek_fuel_ex_8_shimano_xt_12v_29___matte_pennyflake___orange_2023'
},
{
'@type': 'Offer',
color: 'Matte Pennyflake / Orange',
mpn: '5272053',
price: NumberInt('4059'),
priceCurrency: 'EUR',
seller: {
'@type': 'Organization',
name: 'Alltricks'
},
sku: '2456890',
stock: NumberInt('51'),
taille: 'M / 165-177 cm',
url: 'https://www.alltricks.fr/F-11947-velos-complets-vtt/P-2555635-vtt_tout_suspendu_trek_fuel_ex_8_shimano_xt_12v_29___matte_pennyflake___orange_2023'
}
],
sku: '2434006',
tailles: [
'M / 165-177 cm',
'M-L / 173-180 cm',
'L / 177-188 cm',
'XL / 188-196 cm'
]
}
- Afficher uniquement le nom, le fabricant et le modèle (
name,manufacturer.name,modelDate).
db.getCollection('items').findOne({}, {
name:1, 'manufacturer.name':1, 'modelDate':1
});
Résultat
{
_id: ObjectId('6a911c1d3e43e8de87c0d018'),
manufacturer: {
name: 'Trek'
},
name: 'VTT Tout Suspendu Trek Fuel EX 8 Shimano XT 12V 29″ Gris Galactique / Noir 2023'
}
Cette opération s'appelle une projection.
La projection MongoDB est le processus de sélection des champs spécifiques que nous voulons récupérer à partir d'un document plutôt que de récupérer l'intégralité du document.
La projection est le 2e paramètre de la fonction findOne, le premier est le filtre. Dans le cas présent le filtre est vide {}.
Par défaut, _id est toujours retourné sauf exclusion explicite (_id: 0).
1 indique une inclusion, tous les champs sont exclus sauf ceux à 1 et _id qui sont inclus.
0 indique une exclusion tous les champs sont affichés sauf ceux à 0 qui sont exclus.
Il n'est pas possible d'utiliser 1 et 0 en même temp, sauf pour _id.
- Afficher les vélos dont le fabricant est
Cube.
db.getCollection('items').find({'manufacturer.name': 'Cube'},
{ name:1, 'manufacturer.name':1, 'modelDate':1 });
Résultat
{
_id: ObjectId('6a91208f5f7bc715f9d02e8d'),
manufacturer: {
name: 'Cube'
},
modelDate: '2023',
name: 'Cube Stereo One44 C:62 Race Shimano XT 12V 29″ Gris Vert Swamp 2023'
},
{
_id: ObjectId('6a9120aad4fb49912a0d9f22'),
manufacturer: {
name: 'Cube'
},
modelDate: '2024',
name: 'VTT Electrique Tout-Suspendu Cube Stereo Hybrid 140 HPC Pro 750 Shimano Deore 11V 750 Wh 29″ swampgrey´n´black 2024'
},
{
_id: ObjectId('6a9120b64bf14a01d7b7cccc'),
manufacturer: {
name: 'Cube'
},
modelDate: '2024',
name: 'Cube Stereo Hybrid 140 HPC Actionteam 750 Shimano XT 12V 750 Wh 27.5″ Bleu Gris Actionteam 2024'
},
...
- Afficher les vélos dont le modèle est postérieur à 2022.
db.getCollection('items').find(
{'modelDate': { $gte: '2022' }},
{ name:1, 'manufacturer.name':1, 'modelDate':1 });
| Opérateur | Signification | Anglais | Exemple |
|---|---|---|---|
$eq | égal à (equal) | equal to | { prix: { $eq: 100 } } |
$ne | différent de | not equal to | |
$gt | strictement supérieur à | greater than | { prix: { $gt: 100 } } |
$gte | supérieur ou égal à | greater than or equal to | { prix: { $gte: 100 } } |
$lt | strictement inférieur à | less than | { prix: { $lt: 100 } } |
$lte | inférieur ou égal à | less than or equal to | { prix: { $lte: 100 } } |
$in | appartient à une liste | in | { marque: { $in: ["Trek", "Scott"] } } |
$nin | n'appartient pas à une liste | not in | { marque: { $nin: ["Trek", "Scott"] } } |
Résultat
{
_id: ObjectId('6a91202d98201dbb969e80df'),
manufacturer: {
name: 'Trek'
},
modelDate: '2023',
name: 'VTT Tout-Suspendus Trek Fuel EX 7 29″ Shimano Deore/SLX 12V Hex Bleu 2023'
},
{
_id: ObjectId('6a91203b37b3763e627af8b7'),
manufacturer: {
name: 'BMC'
},
modelDate: '2024',
name: 'VTT Tout-Suspendu BMC Fourstroke One Sram GX Eagle AXS 12V 29″ Bleu Ultramarine Noir 2024'
},
...
- Afficher les vélos dont le prix est inférieur à 900 €.
db.getCollection('items').find(
{'offers.price': { $lt: 900} },
{ name:1, 'manufacturer.name':1, 'modelDate':1, 'offers.price': 1 });
Résultat
{
_id: ObjectId('6a9120c95703cecaf3e0d39a'),
manufacturer: {
name: 'Dartmoor'
},
modelDate: '2022',
name: 'Dartmoor Sparrow Intro Mullet 29″/27.5″ Matt Stone Gris 2022',
offers: [
{
price: Double('699.99')
}
]
},
...
- Afficher les vélos dont le poids est inférieur à 15 kg.
2. Requêtes sur les chaînes de caractères
- Trouver les vélos dont le nom contient
Hybrid.
- Trouver les vélos dont le nom contient
750 Wh.
- Trouver les vélos dont le nom commence par
Cube.
- Trouver les vélos dont le nom contient
Shimano.
3. Tableaux
- Trouver tous les vélos appartenant à la catégorie
Électrique.
- Trouver les vélos appartenant à la fois aux catégories
ÉlectriqueetVTT Électrique. - Trouver les vélos qui possèdent exactement deux catégories.
- Trouver les vélos qui possèdent au moins trois catégories.
- Afficher toutes les catégories présentes dans la base, sans doublon.
- Compter le nombre de vélos par catégorie.
4. Les offres commerciales
- Trouver les vélos ayant au moins une offre à moins de 2 000 €.
- Trouver les vélos ayant une offre dont le stock est supérieur à 0.
- Trouver les vélos vendus par
Alltricks. - Trouver les vélos dont une offre concerne une taille de cadre correspondant à
155-166 cm. - Afficher le nom du vélo et uniquement ses offres.
- Déterminer le prix minimum proposé pour chaque vélo.
- Déterminer le prix moyen des offres.
- Trouver les 10 vélos les moins chers.
- Trouver les 10 vélos les plus chers.
- Trouver les vélos ayant une offre à moins de 2 000 € et disponible en stock.
5. Les caractéristiques imbriquées
- Trouver les vélos équipés d'un moteur Bosch.
- Trouver les vélos équipés d'une batterie Bosch PowerTube.
- Trouver les vélos équipés d'un moteur développant 85 Nm.
6. Les géométries
- Trouver les vélos proposant une taille de cadre de 19 pouces.
- Trouver les vélos proposant des roues de 29 pouces.
- Trouver les vélos dont une géométrie possède un
reachsupérieur à 450 mm. - Trouver les vélos proposant une taille de cadre de 19 pouces avec des roues de 29 pouces.
- Afficher uniquement les géométries correspondant aux roues de 29 pouces.
- Pour chaque vélo, déterminer le nombre de tailles de cadre proposées.
- Trouver le vélo proposant le plus grand nombre de tailles de cadre.
7. Agrégations statistiques
Prix
- Quel est le prix moyen des vélos ?
- Quel est le prix moyen par fabricant ?
db.getCollection('items').aggregate([
{
$unwind: "$offers"
},
{
$group: {
_id: '$manufacturer.name',
prixMoyen: { $avg: "$offers.price" }
}
},
{
$sort: {
prixMoyen: -1
}
}
])
- Ajouter le prix minimum et maximum ?
db.getCollection('items').aggregate([
{
$unwind: "$offers"
},
{
$group: {
_id: '$manufacturer.name',
prixMoyen: { $avg: "$offers.price" },
prixMaxi: { $max: "$offers.price" },
prixMini: { $min: "$offers.price" }
}
},
{
$sort: {
prixMoyen: -1
}
}
])
- Quel fabricant propose les vélos les plus chers en moyenne ?
- Combien de vélos sont proposés dans chaque tranche de prix ?
0–999 €
1000–1999 €
2000–2999 €
3000–3999 €
4000 € et plus
fabricants
- Combien de vélos possède chaque fabricant ?
db.getCollection('items').aggregate([
{
$group: {
_id: "$manufacturer.name",
nombre: { $sum: 1 }
}
},
{
$project: {
_id: 0,
fabricant: "$_id",
nombre: 1
}
}
]);
- Quels sont les 3 fabricants ayant le plus de modèles ?
db.getCollection('items').aggregate([
{
$group: {
_id: "$manufacturer.name",
nombre: { $sum: 1 }
}
},
{
$project: {
_id: 0,
fabricant: "$_id",
nombre: 1
}
},
{
$sort: {
nombre: -1
}
},
{
$limit: 3
}
]);
- Quel est le prix moyen des vélos de chaque fabricant ?
- Pour chaque fabricant, donner le prix minimum et maximum.
- Classer les fabricants selon le prix moyen de leurs vélos.
- Ne conserver que les fabricants proposant au moins 5 vélos.
Catégories
- Combien de vélos appartiennent à chaque catégorie ?
db.getCollection('items').aggregate([
{
$unwind: "$categories",
$group: {
_id: '$categorie',
nombre: { $sum: 1 }
},
},
])
- Quelles sont les trois catégories contenant le plus de vélos ?
db.getCollection('items').aggregate([
{
$group: {
_id: '$manufacturer.name',
nombre: { $sum: 1 }
},
},
{
$project: {
_id: 0,
fabricant: "$_id",
nombre: 1
}
},
{
$sort: {
nombre: -1
}
},
{
$limit: 3
}
]);
-
Quel est le prix moyen pour chaque catégorie ?
-
Pour chaque catégorie, quel est le prix maximum ?
-
Quelle catégorie possède le prix moyen le plus élevé ?
Classement
- Pour chaque fabricant, afficher les trois vélos les plus chers.
Vous aurez besoin de
\$sort,\$groupet probablement de\$push.
- Pour chaque fabricant, afficher le vélo le moins cher et le vélo le plus cher.
11. Problèmes de qualité des données
- Identifier les champs qui sont réellement numériques.
- Identifier les champs numériques stockés sous forme de chaînes de caractères.
- Donner un exemple de requête qui serait difficile ou impossible à réaliser correctement à cause du stockage des unités dans les chaînes.
- Proposer une nouvelle structure MongoDB permettant de stocker correctement le poids maximal.
- Expliquer pourquoi stocker
"150 kg"est moins intéressant que stocker :
"poidsMaximum": 150
ou :
"poidsMaximum": {
"value": 150,
"unit": "kg"
}