Qu'est-ce qu'un curseur ?
Un curseur est un pointeur vers le résultat d'une requête. MongoDB ne charge pas tout d'un coup : il fournit les documents au fur et à mesure. Dans mongosh, le curseur affiche les premiers résultats et propose « it » pour la suite.
sort, limit, skip s'appliquent sur le curseur, avant que les documents ne soient réellement renvoyés. Elles se chaînent.sort() — trier
1 = croissant, -1 = décroissant. On peut trier sur plusieurs champs.
db.clients.find().sort({ points: -1 }) // + de points d'abord
db.clients.find().sort({ ville: 1, points: -1 }) // ville A→Z, puis points
limit() & skip() — paginer
limit(n) borne le nombre de résultats ; skip(n) en saute. Ensemble, ils réalisent la pagination.
// top 3 db.clients.find().sort({ points: -1 }).limit(3) // page 2, 10 par page db.clients.find().skip(10).limit(10)
countDocuments() & distinct()
countDocuments(filtre) compte les documents correspondants ; distinct(champ) liste les valeurs uniques d'un champ.
db.campagnes.countDocuments({ statut: "OUVERTE" }) // combien de campagnes ouvertes
db.clients.distinct("ville") // liste des villes distinctes
Tout enchaîner
Filtre + projection + tri + pagination dans une seule requête :
db.campagnes.find(
{ statut: "OUVERTE" }, // filtre
{ zone: 1, dateLimite: 1, _id: 0 } // projection
).sort({ dateLimite: 1 }).limit(5) // 5 plus urgentes
Exercices de synthèse (ch. 1 → 8)
Sur ta base fioul (avec quelques campagnes et fournisseurs), écris les requêtes suivantes :
- Les 3 campagnes ouvertes dont la date limite est la plus proche.
- Le nombre de campagnes par statut (
countDocumentspour chaque, ou attendre l'agrégation du ch. 14). - La liste des communes distinctes présentes dans les commandes.
- Ajouter une commande à une campagne (
$push), puis afficher la campagne avec seulementzoneet ses 2 premièrescommandes($slice). - Passer une campagne à
CLOTUREEet l'horodater ($set+$currentDate).
Ces requêtes préfigurent les fonctionnalités de l'appli : liste triée des campagnes urgentes, pagination de la liste, statistiques par statut. Garde-les dans un playground VS Code : elles serviront de spécification quand tu écriras l'API.
find()renvoie un curseur ; on y chaînesort,skip,limit.- Ordre appliqué : sort → skip → limit.
countDocuments()compte ;distinct()liste les valeurs uniques.