🛢️Parcours Fioul GroupéMongoDB · Chapitre 07
Accueil › MongoDB › Chapitre 07
Chapitre 07 / 17

Les projections

Une projection choisit les champs renvoyés par une requête. Bien projeter, c'est renvoyer moins de données (plus rapide, plus léger sur le réseau) et ne montrer au client que ce qui le concerne.

1 Notion

Le principe

La projection est le second argument de find() : un objet qui indique, champ par champ, ce qu'on garde (1) ou ce qu'on retire (0).

db.collection.find( filtre, projection )
À retenir — le filtre décide quels documents ; la projection décide quels champs de ces documents.
2 Mode

Inclusion — ne garder que certains champs

On liste les champs à inclure avec 1. Tous les autres sont exclus (sauf _id, cas particulier).

db.clients.find({}, { nom: 1, points: 1 })

Résultat

{ _id: ObjectId("..."), nom: "Dupont", points: 120 } { _id: ObjectId("..."), nom: "Martin", points: 80 }
3 Mode

Exclusion — tout garder sauf…

À l'inverse, on liste les champs à exclure avec 0. Tous les autres sont conservés.

db.clients.find({}, { adresse: 0 })   // tout sauf l'adresse
Règle — on ne mélange pas inclusion et exclusion dans la même projection (erreur), à la seule exception de _id qu'on peut exclure tout en incluant d'autres champs.
4 Cas

Le cas particulier _id

_id est renvoyé par défaut, même en mode inclusion. Pour le masquer, il faut l'exclure explicitement.

db.clients.find({}, { nom: 1, _id: 0 })

Résultat

{ nom: "Dupont" } { nom: "Martin" }
5 Avancé

Projeter une partie d'un tableau

$slice limite le nombre d'éléments renvoyés d'un tableau ; $elemMatch (en projection) ne renvoie que le premier élément qui correspond.

// ne renvoyer que les 2 premières commandes de chaque campagne
db.campagnes.find({}, { zone: 1, commandes: { $slice: 2 } })

// ne renvoyer que la commande de Ladignac
db.campagnes.find(
  { },
  { commandes: { $elemMatch: { commune: "Ladignac" } } }
)
6 Avancé

Projeter des champs imbriqués

On cible un champ dans un sous-document avec la notation pointée.

db.clients.find({}, { "nom": 1, "adresse.ville": 1, _id: 0 })

Résultat

{ nom: "Dupont", adresse: { ville: "Limoges" } }
🛢️ Sur le projet Fioul Groupé

Pour l'écran « liste des campagnes », on ne renvoie pas tout : juste zone, statut, dateLimite (projection en inclusion, _id: 0 si inutile). La grosse liste des commandes n'est chargée que sur l'écran de détail. C'est exactement le rôle des DTO côté Spring : décider quoi exposer.

Ce qu'il faut retenir du chapitre
  • Projection = 2e argument de find() : 1 inclut, 0 exclut.
  • Pas de mélange inclusion/exclusion (sauf _id).
  • _id est renvoyé par défaut ; _id: 0 pour le masquer.
  • Tableaux : $slice, $elemMatch ; imbriqué : notation pointée.
← Chapitre 06