Signatur
Beschreibung
Die Klasse MongoDB\Driver\Query gehört zur offiziellen MongoDB-PHP-Erweiterung (ext-mongodb) und dient dazu, eine Abfrage gegen eine MongoDB-Kollektion zu definieren. Dabei werden Filterbedingungen (analog zu einem WHERE-Ausdruck in SQL) zusammen mit optionalen Abfrageeinstellungen wie Projektion, Sortierung, Limit und Skip in einem Objekt gebündelt.
Ein Query-Objekt wird anschließend an MongoDB\Driver\Manager::executeQuery() übergeben, welche die Abfrage auf dem Server ausführt und ein MongoDB\Driver\Cursor-Objekt zurückliefert, über das die Ergebnisdokumente iteriert werden können. Die Klasse selbst führt keine Verbindung zum Server auf – sie ist ein reines Wert-Objekt.
Der Filter-Parameter akzeptiert ein assoziatives Array oder ein Objekt, das MongoDB-Abfrageoperatoren wie $eq, $gt, $in usw. enthalten kann. Über den queryOptions-Parameter lassen sich u. a. Projektion (projection), Sortierung (sort), limit, skip, batchSize und weitere Cursor-Optionen steuern.
Die Klasse kann nicht erweitert werden (sie ist final). Für komplexere Anforderungen — etwa Aggregation Pipelines — stehen andere Klassen wie MongoDB\Driver\Command bereit.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $filter Pflicht | array|object | Der Abfragefilter als assoziatives Array oder Objekt. Kann MongoDB-Abfrageoperatoren wie $eq, $gt, $in, $regex usw. enthalten. Ein leeres Array [] entspricht keinem Filter (alle Dokumente). |
|
| $queryOptions | array|null | null | Optionales assoziatives Array mit Abfrageoptionen. Häufig genutzte Schlüssel: projection (zurückzugebende Felder), sort (Sortierreihenfolge), limit (maximale Anzahl Dokumente), skip (zu überspringende Dokumente), batchSize, noCursorTimeout, readConcern und collation. |
Beispiele
Einfache Abfrage mit Filter und Projektion
<?php
$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
// Alle Benutzer, die älter als 18 Jahre sind
$filter = ['age' => ['$gt' => 18]];
$options = [
'projection' => ['_id' => 0, 'name' => 1, 'age' => 1],
'sort' => ['age' => 1], // aufsteigend nach Alter
'limit' => 10,
];
$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery('mydb.users', $query);
foreach ($cursor as $document) {
echo $document->name . ' (' . $document->age . ')' . PHP_EOL;
}
Abfrage mit Regex-Filter und Paginierung
<?php
$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
// Produkte, deren Name mit "Laptop" beginnt, Seite 2 (je 5 Einträge)
$seite = 2;
$proSeite = 5;
$filter = [
'name' => ['$regex' => '^Laptop', '$options' => 'i'],
'inStock' => true,
];
$options = [
'sort' => ['price' => -1], // teuerste zuerst
'skip' => ($seite - 1) * $proSeite,
'limit' => $proSeite,
];
$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery('shop.products', $query);
foreach ($cursor as $produkt) {
printf("%-30s %6.2f EUR\n", $produkt->name, $produkt->price);
}
// Wichtig · Fallstricke
Sicherheit: Da MongoDB-Abfragen keine klassische String-Interpolation verwenden, ist das Risiko einer Injection geringer als bei SQL. Dennoch sollten Benutzereingaben, die als Filterwerte dienen, stets validiert und typisiert werden — besonders bei verschachtelten Operatoren, da ein Angreifer sonst ggf. eigene Operatoren einschleusen kann (sog. Operator Injection). Verwende niemals unkontrolliert $_GET- oder $_POST-Daten direkt als Filter-Array.
Klasse ist final: MongoDB\Driver\Query kann nicht subklassiert werden. Für Aggregations-Pipelines nutze stattdessen MongoDB\Driver\Command mit dem aggregate-Befehl oder die High-Level-Bibliothek mongodb/mongodb.
ext-mongodb vs. mongo: Diese Klasse gehört zur neuen Erweiterung ext-mongodb. Die veraltete Erweiterung ext-mongo ist seit PHP 7 nicht mehr verfügbar und sollte nicht mehr verwendet werden.