Opérateurs de comparaison : $eq, $gt, $lt, $in
Vous utiliserez des opérateurs de comparaison pour filtrer les documents selon des plages numériques, des correspondances exactes et l’appartenance à une liste.
Opérateurs de comparaison : $eq, $gt, $lt, $in est une leçon MongoDB Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage MongoDB Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours MongoDB Academy comprend 4 leçons au total.
Au-delà des filtres d'égalité
Les filtres d'égalité simples comme { status: 'active' } sont utiles, mais les requêtes réelles nécessitent davantage de nuances. MongoDB fournit un riche ensemble d'opérateurs de requête préfixés par $, qui permettent d'exprimer des conditions allant au-delà de la simple égalité. Ces opérateurs vous permettent de filtrer selon des intervalles numériques, l'appartenance à une liste, la présence d'une valeur et la correspondance avec un modèle.
Les opérateurs de comparaison sont la catégorie la plus utilisée. Ils fonctionnent avec tout type BSON comparable : nombres, chaînes de caractères (comparaison lexicographique), dates et même ObjectIds (dans l'ordre chronologique, puisque les ObjectIds encodent des horodatages).
$eq : égalité explicite
L'opérateur $eq teste explicitement l'égalité : { age: { $eq: 30 } }. Dans la plupart des cas, la forme abrégée { age: 30 } est identique et préférable pour la lisibilité ; $eq est principalement utile lorsque l'opérateur est nécessaire à l'intérieur d'une autre expression comme $expr.
Une différence existe : $eq est requis dans les expressions de pipeline d'agrégation lorsqu'il faut comparer deux valeurs de champ (par exemple { $eq: ['$price', '$salePrice'] }). Dans les filtres find classiques, utilisez la syntaxe abrégée de l'égalité, sauf si un contexte particulier impose la forme avec opérateur.
// These two queries are equivalent in find()
db.users.find({ age: 30 });
db.users.find({ age: { $eq: 30 } });
// $eq is useful inside $expr for field-to-field comparison:
db.products.find({
$expr: { $eq: ['$price', '$salePrice'] }
});
// Returns products where price equals salePrice$gt et $gte : supérieur à
$gt (supérieur à) et $gte (supérieur ou égal à) filtrent les documents dont la valeur d'un champ dépasse un seuil. Ils fonctionnent avec les nombres, les dates, les chaînes de caractères (ordre lexicographique) et les ObjectIds.
Les comparaisons de dates sont particulièrement puissantes : { createdAt: { $gte: new Date('2024-01-01') } } trouve tous les documents créés depuis le 1er janvier 2024. Cette requête peut utiliser un index sur createdAt pour atteindre une complexité en O(log n), ce qui rend les requêtes sur des intervalles de dates extrêmement efficaces, même dans de grandes collections.
// Numeric range
db.products.find({ price: { $gt: 100 } });
// price > 100
db.employees.find({ salary: { $gte: 50000 } });
// salary >= 50000
// Date comparison
db.orders.find({
createdAt: { $gte: new Date('2024-01-01') }
});
// Orders placed since Jan 1, 2024
// String comparison (lexicographic)
db.users.find({ lastName: { $gte: 'M' } });
// Last names starting with M-Z$lt et $lte : inférieur à
$lt (inférieur à) et $lte (inférieur ou égal à) sont les compléments de $gt/$gte. Combinez les deux opérateurs sur le même champ pour créer une requête sur un intervalle : MongoDB applique les deux conditions au même champ, ce qui équivaut à BETWEEN en SQL.
Les requêtes sur des intervalles portant sur des champs indexés sont très efficaces, car MongoDB peut se positionner sur la borne inférieure dans l'index, puis parcourir celui-ci jusqu'à la borne supérieure en ne consultant que les entrées pertinentes. C'est l'une des principales raisons d'indexer les champs sur lesquels vous effectuez fréquemment des filtrages par intervalle.
// Price < 50
db.products.find({ price: { $lt: 50 } });
// Age <= 17 (minors)
db.users.find({ age: { $lte: 17 } });
// Range query: price between 20 and 100 (inclusive)
db.products.find({ price: { $gte: 20, $lte: 100 } });
// Equivalent SQL: WHERE price BETWEEN 20 AND 100
// Date range: orders placed last week
const weekAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
db.orders.find({ createdAt: { $gte: weekAgo, $lte: new Date() } });$ne : différent de
$ne (différent de) sélectionne les documents dont la valeur d'un champ n'est pas égale à la valeur indiquée. Il sélectionne également les documents dans lesquels le champ n'existe pas du tout, car un champ manquant est implicitement différent de toute valeur.
Soyez prudent avec $ne dans les grandes collections non indexées : MongoDB ne peut généralement pas utiliser efficacement un index pour satisfaire une négation et peut revenir à un parcours de la collection. Pour les requêtes comportant de nombreux filtres, privilégiez autant que possible les conditions positives ($eq, $in) aux conditions négatives.
// Find orders that are not cancelled
db.orders.find({ status: { $ne: 'cancelled' } });
// Find users who have NOT set a display name
// ($ne also matches missing field)
db.users.find({ displayName: { $ne: null } });
// Caution: $ne on non-indexed field scans full collection
// Index the field if used frequently:
db.orders.createIndex({ status: 1 });
db.orders.find({ status: { $ne: 'cancelled' } }); // Uses index$in : faire correspondre n'importe quelle valeur d'une liste
$in sélectionne les documents dont la valeur d'un champ est égale à l'une quelconque des valeurs d'un tableau fourni. C'est l'équivalent MongoDB de la clause SQL IN. Cette solution est bien plus concise que l'écriture de plusieurs conditions $or pour un même champ.
Sur un champ indexé, $in est implémenté sous la forme de plusieurs recherches ponctuelles dans l'arbre d'index, une par valeur du tableau, ce qui est très efficace. Pour les grandes listes (des centaines de valeurs), les performances diminuent, mais pour les cas d'utilisation habituels (5 à 20 valeurs), $in est un excellent choix.
// Find products in specific categories
db.products.find({
category: { $in: ['Electronics', 'Computers', 'Peripherals'] }
});
// Equivalent SQL: WHERE category IN ('Electronics', 'Computers', 'Peripherals')
// Find orders with specific statuses
db.orders.find({
status: { $in: ['pending', 'processing', 'shipped'] }
});
// $in on array field: matches if arrays share any element
db.products.find({
tags: { $in: ['sale', 'clearance'] }
}); // Products with 'sale' OR 'clearance' in their tags array$nin : ne pas appartenir à une liste
$nin (ne se trouve pas dans) est la négation de $in : il sélectionne les documents dont la valeur du champ ne se trouve pas dans le tableau fourni, et sélectionne également les documents dans lesquels le champ est absent. Comme $ne, il peut être moins efficace que $in, car il nécessite souvent de parcourir les documents.
Cas d'utilisation pratique : exclure un ensemble connu d'identifiants. Si un utilisateur a bloqué certains autres utilisateurs, vous pouvez exclure leur contenu : { authorId: { $nin: blockedUserIds } }. Pour de meilleures performances, veillez à garder la liste d'exclusion courte.
// Exclude archived and deleted statuses
db.tickets.find({
status: { $nin: ['archived', 'deleted', 'spam'] }
});
// Exclude a user's own posts from their feed
const blockedIds = [ObjectId('...'), ObjectId('...')] ;
db.posts.find({
authorId: { $nin: blockedIds }
}).sort({ createdAt: -1 }).limit(20);Combiner des opérateurs de comparaison
Vous pouvez combiner plusieurs opérateurs de comparaison sur le même champ ou sur des champs différents au sein d'une seule requête. Lorsque les opérateurs apparaissent sur le même champ dans un objet, ils agissent comme un AND implicite : les deux conditions doivent être vraies. Lorsqu'ils portent sur des champs différents, les deux conditions doivent également être vraies.
Construisez des filtres complexes en réfléchissant à chaque champ indépendamment, puis en combinant les conditions. MongoDB évalue ensemble toutes les conditions portant sur les champs et utilise les index disponibles afin de réduire au minimum le nombre de documents examinés.
// Products priced between $20-$100, in stock, created this year
const thisYear = new Date('2024-01-01');
db.products.find({
price: { $gte: 20, $lte: 100 }, // Range on price
stock: { $gt: 0 }, // In stock
category: { $in: ['Electronics', 'Home'] }, // Category filter
createdAt: { $gte: thisYear } // Created this year
}).sort({ price: 1 });Opérateurs de comparaison sur les dates
Les comparaisons de dates comptent parmi les utilisations les plus courantes des opérateurs de comparaison dans les applications réelles. Le type BSON Date de MongoDB stocke les dates sous forme de millisecondes sur 64 bits ; tous les opérateurs de comparaison fonctionnent donc naturellement sur les champs de date.
Parmi les schémas courants figurent la recherche des enregistrements créés au cours des N derniers jours, le filtrage des abonnements actifs qui expirent après aujourd'hui et les requêtes sur des intervalles correspondant à des périodes de rapport. Construisez toujours des objets Date dans la requête : ne comparez jamais les dates sous forme de chaînes, car la comparaison lexicographique des chaînes produit des résultats incorrects pour la plupart des formats de date.
// Records created in the last 30 days
const thirtyDaysAgo = new Date();
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
db.events.find({ createdAt: { $gte: thirtyDaysAgo } });
// Subscriptions that expire in the future (still active)
db.subscriptions.find({ expiresAt: { $gt: new Date() } });
// Orders placed on a specific day (date range for one day)
const startOfDay = new Date('2024-06-01T00:00:00Z');
const endOfDay = new Date('2024-06-01T23:59:59.999Z');
db.orders.find({ createdAt: { $gte: startOfDay, $lte: endOfDay } });Performances : index et requêtes de comparaison
Les opérateurs de comparaison bénéficient énormément des index. Un index sur un champ numérique transforme un parcours en O(n) en une opération en O(log n + taille du résultat). Points essentiels :
- Les requêtes sur des intervalles (
$gt,$lt) peuvent utiliser un index à champ unique pour accéder directement au début de l'intervalle $ineffectue plusieurs recherches ponctuelles dans l'index, une par valeur- Les opérateurs de négation (
$ne,$nin) parcourent souvent l'index au lieu d'effectuer des recherches ponctuelles et sont donc moins efficaces - Utilisez
explain('executionStats')pour vérifier que vos requêtes de comparaison utilisent IXSCAN et non COLLSCAN
// Verify range query uses index
db.products.find({ price: { $gte: 20, $lte: 100 } })
.explain('executionStats');
// Look for: winningPlan.stage = 'IXSCAN'
// If COLLSCAN: add index with db.products.createIndex({ price: 1 })
// Create compound index for combined filter:
db.products.createIndex({ category: 1, price: 1 });
// Supports: { category: 'Electronics', price: { $gte: 50 } }Utiliser les opérateurs de comparaison avec l'agrégation
Les opérateurs de comparaison apparaissent dans deux contextes : comme opérateurs de requête dans les filtres de find() (avec la syntaxe { field: { : value } }) et comme opérateurs d'expression dans le pipeline d'agrégation, dans les étapes et (avec une syntaxe différente : { : ['', value] }).
Dans , les opérateurs d'expression renvoient une valeur booléenne ou une valeur calculée. Par exemple, vous pouvez ajouter un champ calculé isExpensive qui vaut vrai lorsque le prix dépasse 100 : { : { isExpensive: { : ['', 100] } } }. L'étape utilise la même syntaxe de requête que find().
// Comparison in aggregation pipeline:
db.products.aggregate([
// uses same syntax as find()
{ : { price: { : 20, : 100 } } },
// uses expression operator syntax:
{
: {
isExpensive: { : ['', 80] }, // Returns boolean
discountedPrice: { : ['', 0.9] } // Computes value
}
}
]);Vérification rapide
Vérifiez votre compréhension des concepts de MongoDB et des bases de données NoSQL présentés dans cette leçon.
Récapitulatif de la leçon
Dans cette leçon, vous avez appris que $gt/$gte/$lt/$lte créent des conditions d'intervalle sur les nombres, les dates et les chaînes, et fonctionnent avec les index pour effectuer des parcours d'intervalles en O(log n), que $in sélectionne toute valeur d'une liste et est nettement plus lisible et efficace que plusieurs conditions d'égalité $or sur le même champ, et que $ne/$nin sont des opérateurs de négation qui sélectionnent tout ce qui se trouve en dehors de la valeur ou de la liste indiquée, mais sont moins efficaces avec les index que leurs équivalents positifs. Nous allons maintenant découvrir les opérateurs logiques — $and, $or, $nor et $not — afin de combiner des conditions portant sur différents champs.
Apprends JavaScript avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 30
- Leçons
- 120
Questions Fréquemment Posées
La leçon « Opérateurs de comparaison : $eq, $gt, $lt, $in » est-elle gratuite ?
Oui — le texte complet de « Opérateurs de comparaison : $eq, $gt, $lt, $in » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours MongoDB Academy, passe à CoddyKit PRO. Le cours MongoDB Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Opérateurs de comparaison : $eq, $gt, $lt, $in » ?
Vous utiliserez des opérateurs de comparaison pour filtrer les documents selon des plages numériques, des correspondances exactes et l’appartenance à une liste. Tu pratiques MongoDB Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer MongoDB Academy ?
Aucune expérience préalable n'est requise. MongoDB Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Opérateurs de comparaison : $eq, $gt, $lt, $in » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon MongoDB Academy ?
Oui. Chaque leçon MongoDB Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Opérateurs de comparaison : $eq, $gt, $lt, $in
- Opérateurs logiques : $and, $or, $nor, $not
- Opérateurs d’élément et vérifications de type
- Requêtes avec expressions régulières et recherche de motifs