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

Les opérateurs de recherche

Au-delà de l'égalité simple, les opérateurs (préfixés par $) rendent les filtres de find() vraiment expressifs : comparaisons, listes, combinaisons logiques, présence d'un champ, motifs de texte.

1 Rappel

L'égalité simple

La forme la plus simple d'un filtre : { champ: valeur }. Elle sélectionne les documents dont le champ vaut exactement cette valeur.

db.clients.find({ ville: "Limoges" })
À savoir — si le champ est un tableau, l'égalité renvoie aussi les documents dont le tableau contient la valeur.
2 Opérateurs

Les opérateurs de comparaison

Ils comparent la valeur d'un champ à une référence.

OpérateurSignifie
$eq / $neégal / différent
$gt / $gtesupérieur / supérieur ou égal
$lt / $lteinférieur / inférieur ou égal

Exemple — clients avec plus de 100 points

db.clients.find({ points: { $gt: 100 } })

Exemple — points entre 50 et 150 (inclus)

db.clients.find({ points: { $gte: 50, $lte: 150 } })
3 Opérateurs

Chercher dans une liste de valeurs

$in teste si la valeur figure dans une liste ; $nin teste l'inverse.

db.clients.find({ ville: { $in: ["Limoges", "Brive"] } })
db.clients.find({ ville: { $nin: ["Paris"] } })
Astuce — $in évite d'empiler plusieurs $or quand on teste le même champ contre plusieurs valeurs.
4 Opérateurs

Les opérateurs logiques

Plusieurs champs dans le même objet forment déjà un ET implicite. Pour un OU, ou des combinaisons, on utilise $and, $or, $nor, $not.

ET implicite

db.clients.find({ ville: "Limoges", points: { $gte: 80 } })

OU explicite

db.clients.find({ $or: [
  { ville: "Brive" },
  { points: { $gt: 150 } }
] })
À retenir — $or et $and prennent un tableau de conditions. On combine sans limite : un $or peut contenir des conditions elles-mêmes composées.
5 Opérateurs

Présence d'un champ & type

$exists teste si un champ est présent ; $type teste son type BSON. Très utile quand la collection n'a pas de schéma strict.

// clients qui ont un champ "email"
db.clients.find({ email: { $exists: true } })

// documents où "points" est bien un nombre
db.clients.find({ points: { $type: "number" } })
Cas concret — repérer les documents « incomplets » (champ manquant) est fréquent en NoSQL, justement parce que le schéma n'est pas imposé.
6 Opérateurs

Rechercher un motif de texte ($regex)

$regex filtre sur une expression régulière — pratique pour « commence par », « contient », etc. (Pour de la vraie recherche plein-texte, on verra l'index texte au chapitre 12.)

// villes commençant par "Lim"
db.clients.find({ ville: { $regex: "^Lim" } })

// insensible à la casse
db.clients.find({ ville: { $regex: "brive", $options: "i" } })
🛢️ Sur le projet Fioul Groupé

Écris les filtres qui serviront à l'écran de recherche de l'appli : les campagnes statut: "OUVERTE" ET zone: "Ladignac-le-Long" ; celles dont la dateLimite est $gte à aujourd'hui (new Date()) ; celles de plusieurs communes avec $in. Ces filtres deviendront les méthodes du repository Spring (ex. findByZoneAndStatut).

Ce qu'il faut retenir du chapitre
  • Comparaison : $gt, $gte, $lt, $lte, $ne.
  • Listes : $in, $nin.
  • Logique : ET implicite ; $or, $and, $nor, $not.
  • Structure : $exists, $type ; texte : $regex.
← Chapitre 03