Vergleichsoperatoren: $eq, $gt, $lt, $in
Verwenden Sie Vergleichsoperatoren, um Dokumente nach Zahlenbereichen, exakten Übereinstimmungen und der Zugehörigkeit zu einer Liste zu filtern.
Vergleichsoperatoren: $eq, $gt, $lt, $in ist eine kostenlose MongoDB Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des MongoDB Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der MongoDB Academy-Kurs umfasst insgesamt 4 Lektionen.
Über einfache Gleichheitsfilter hinaus
Einfache Gleichheitsfilter wie { status: 'active' } sind nützlich, aber echte Abfragen benötigen mehr Differenzierung. MongoDB bietet eine umfangreiche Gruppe von Abfrageoperatoren mit dem Präfix $, die Bedingungen jenseits einfacher Gleichheit ausdrücken. Mit diesen Operatoren können Sie nach numerischen Bereichen, der Zugehörigkeit zu einer Liste, dem Vorhandensein von Werten und Mustern filtern.
Vergleichsoperatoren sind die am häufigsten verwendete Kategorie. Sie funktionieren mit jedem vergleichbaren BSON-Typ: Zahlen, Zeichenfolgen (lexikografischer Vergleich), Datumsangaben und sogar ObjectIds (chronologische Reihenfolge, da ObjectIds Zeitstempel codieren).
$eq: Explizite Gleichheit
Der Operator $eq prüft ausdrücklich auf Gleichheit: { age: { $eq: 30 } }. In den meisten Fällen ist die Kurzschreibweise { age: 30 } identisch und wegen der besseren Lesbarkeit vorzuziehen. $eq ist hauptsächlich dann nützlich, wenn der Operator innerhalb eines anderen Ausdrucks wie $expr benötigt wird.
Ein Unterschied besteht darin, dass $eq innerhalb von Ausdrücken einer Aggregationspipeline erforderlich ist, wenn zwei Feldwerte verglichen werden (z. B. { $eq: ['$price', '$salePrice'] }). Verwenden Sie in regulären Find-Filtern die Kurzschreibweise für Gleichheit, sofern ein bestimmter Kontext nicht die Operatorsyntax erfordert.
// 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 und $gte: Größer als
$gt (größer als) und $gte (größer oder gleich) filtern Dokumente, deren Feldwert einen Schwellenwert überschreitet. Sie funktionieren mit Zahlen, Datumsangaben, Zeichenfolgen (lexikografische Reihenfolge) und ObjectIds.
Vergleiche von Datumsangaben sind besonders leistungsfähig: { createdAt: { $gte: new Date('2024-01-01') } } findet alle Dokumente, die seit dem 1. Januar 2024 erstellt wurden. Diese Abfrage kann einen Index auf createdAt für eine Leistung von O(log n) verwenden, wodurch Bereichsabfragen selbst in großen Collections äußerst effizient werden.
// 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 und $lte: Kleiner als
$lt (kleiner als) und $lte (kleiner oder gleich) sind die Gegenstücke zu $gt/$gte. Kombinieren Sie beide Operatoren für dasselbe Feld, um eine Bereichsabfrage zu erstellen. MongoDB wendet beide Bedingungen auf dasselbe Feld an, entsprechend BETWEEN in SQL.
Bereichsabfragen für indizierte Felder sind sehr effizient, da MongoDB im Index zur unteren Grenze springen und bis zur oberen Grenze vorwärts suchen kann. Dabei werden nur die relevanten Einträge berücksichtigt. Dies ist einer der Hauptgründe, Felder zu indizieren, nach denen Sie häufig anhand von Bereichen filtern.
// 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: Ungleich
$ne (ungleich) findet Dokumente, deren Feldwert nicht dem angegebenen Wert entspricht. Der Operator findet auch Dokumente, in denen das Feld überhaupt nicht vorhanden ist, da ein fehlendes Feld implizit keinem Wert entspricht.
Seien Sie bei der Verwendung von $ne für große, nicht indizierte Collections vorsichtig: MongoDB kann einen Index normalerweise nicht effizient für eine Negation verwenden und greift möglicherweise auf einen Collection-Scan zurück. Bevorzugen Sie bei stark gefilterten Abfragen nach Möglichkeit positive Bedingungen ($eq, $in) gegenüber negativen.
// 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: Einen beliebigen Wert aus einer Liste finden
$in findet Dokumente, deren Feldwert einem beliebigen Wert in einem angegebenen Array entspricht. Der Operator entspricht der SQL-Klausel IN in MongoDB. Das ist wesentlich kompakter, als mehrere $or-Bedingungen für dasselbe Feld zu schreiben.
Bei einem indizierten Feld wird $in als mehrere Punktabfragen im Indexbaum implementiert – eine pro Wert im Array –, was sehr effizient ist. Bei großen Listen mit Hunderten von Werten nimmt die Leistung ab, aber für typische Anwendungsfälle mit 5 bis 20 Werten ist $in eine gute Wahl.
// 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: Nicht in einer Liste
$nin (nicht in) ist die Negation von $in. Der Operator findet Dokumente, deren Feldwert nicht im angegebenen Array enthalten ist (und auch Dokumente, in denen das Feld fehlt). Wie $ne kann er weniger effizient als $in sein, da häufig Dokumente durchsucht werden müssen.
Ein praktischer Anwendungsfall ist das Ausschließen einer bekannten Gruppe von IDs. Wenn ein Benutzer bestimmte andere Benutzer blockiert hat, können Sie deren Inhalte ausschließen: { authorId: { $nin: blockedUserIds } }. Halten Sie die Ausschlussliste für eine optimale Leistung klein.
// 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);Vergleichsoperatoren kombinieren
Sie können mehrere Vergleichsoperatoren für dasselbe oder für unterschiedliche Felder in einer einzelnen Abfrage kombinieren. Wenn Operatoren in einem Objekt für dasselbe Feld angegeben werden, bilden sie ein implizites AND – beide Bedingungen müssen erfüllt sein. Bei unterschiedlichen Feldern müssen ebenfalls beide Bedingungen erfüllt sein.
Erstellen Sie komplexe Filter, indem Sie jedes Feld unabhängig betrachten und die Bedingungen kombinieren. MongoDB wertet alle Feldbedingungen gemeinsam aus und verwendet verfügbare Indizes, um die Anzahl der untersuchten Dokumente zu minimieren.
// 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 });Vergleichsoperatoren für Datumsangaben
Vergleiche von Datumsangaben gehören in realen Anwendungen zu den häufigsten Einsatzgebieten von Vergleichsoperatoren. MongoDBs BSON-Typ Date speichert Datumsangaben als 64-Bit-Millisekundenwerte, sodass alle Vergleichsoperatoren auf Datumsfeldern natürlich funktionieren.
Häufige Muster sind das Finden von Datensätzen, die in den letzten N Tagen erstellt wurden, das Filtern aktiver Abonnements, die nach heute ablaufen, und Bereichsabfragen für Berichtszeiträume. Erstellen Sie in der Abfrage immer Date-Objekte. Vergleichen Sie Datumsangaben niemals als Zeichenfolgen, da der lexikografische Vergleich für die meisten Datumsformate falsche Ergebnisse liefert.
// 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 } });Leistung: Indizes und Vergleichsabfragen
Vergleichsoperatoren profitieren enorm von Indizes. Ein Index für ein numerisches Feld verwandelt einen O(n)-Scan in O(log n + Ergebnisgröße). Wichtige Punkte:
- Bereichsabfragen (
$gt,$lt) können einen Einzelfeldindex verwenden, um direkt zum Beginn des Bereichs zu navigieren $inführt mehrere Punktabfragen im Index durch – eine pro Wert- Negationsoperatoren (
$ne,$nin) durchsuchen häufig den Index, statt Punktabfragen zu verwenden, und sind daher weniger effizient - Verwenden Sie
explain('executionStats'), um zu überprüfen, dass Ihre Vergleichsabfragen IXSCAN und nicht COLLSCAN verwenden
// 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 } }Vergleichsoperatoren mit Aggregation verwenden
Vergleichsoperatoren treten in zwei Kontexten auf: als Abfrageoperatoren in find()-Filtern (mit der Syntax { field: { : value } }) und als Ausdrucksoperatoren in den Aggregationspipeline-Phasen und (mit einer anderen Syntax: { : ['', value] }).
In geben Ausdrucksoperatoren einen booleschen Wert oder einen berechneten Wert zurück. Sie können beispielsweise ein berechnetes Feld isExpensive hinzufügen, das true ist, wenn der Preis 100 überschreitet: { : { isExpensive: { : ['', 100] } } }. Die Phase verwendet dieselbe Abfragesyntax wie 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
}
}
]);Kurzer Test
Testen Sie Ihr Verständnis der Konzepte zu MongoDB und NoSQL-Datenbanken aus dieser Lektion.
Zusammenfassung der Lektion
In dieser Lektion haben Sie gelernt: $gt/$gte/$lt/$lte erstellen Bereichsbedingungen für Zahlen, Datumsangaben und Zeichenfolgen und funktionieren bei Bereichsscans mit O(log n) mit Indizes; $in findet jeden Wert aus einer Liste und ist deutlich lesbarer und effizienter als mehrere $or-Gleichheitsbedingungen für dasselbe Feld; und $ne/$nin sind Negationsoperatoren, die alles außerhalb des angegebenen Werts bzw. der angegebenen Liste finden, aber weniger effizient mit Indizes arbeiten als ihre positiven Gegenstücke. Als Nächstes sehen wir uns logische Operatoren – $and, $or, $nor und $not – an, um Bedingungen für unterschiedliche Felder zu kombinieren.
Lerne JavaScript mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 30
- Lektionen
- 120
Häufig gestellte Fragen
Ist die Lektion „Vergleichsoperatoren: $eq, $gt, $lt, $in“ kostenlos?
Ja — der vollständige Text von „Vergleichsoperatoren: $eq, $gt, $lt, $in“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des MongoDB Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der MongoDB Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Vergleichsoperatoren: $eq, $gt, $lt, $in“?
Verwenden Sie Vergleichsoperatoren, um Dokumente nach Zahlenbereichen, exakten Übereinstimmungen und der Zugehörigkeit zu einer Liste zu filtern. Du übst MongoDB Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um MongoDB Academy zu starten?
Keine Vorkenntnisse erforderlich. MongoDB Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Vergleichsoperatoren: $eq, $gt, $lt, $in“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser MongoDB Academy-Lektion Code schreiben und ausführen?
Ja. Jede MongoDB Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Vergleichsoperatoren: $eq, $gt, $lt, $in
- Logische Operatoren: $and, $or, $nor, $not
- Elementoperatoren und Typprüfungen
- Regex-Abfragen und Mustersuche