Signatur
Beschreibung
MongoDB\Driver\WriteResult wird von den Methoden MongoDB\Driver\Manager::executeBulkWrite() zurückgegeben und kapselt alle statistischen Informationen über den Erfolg oder Misserfolg einer Schreiboperation. Das Objekt ist read-only und stellt eine Reihe von Getter-Methoden bereit, über die man z. B. die Anzahl eingefügter, aktualisierter oder gelöschter Dokumente abrufen kann.
Besonders nützlich ist die Klasse, wenn man nach einer BulkWrite-Operation prüfen möchte, welche Dokument-IDs beim Insert erzeugt wurden (getInsertedIds()), ob ein Upsert stattgefunden hat oder wie viele Dokumente tatsächlich modifiziert wurden. Bei aktiviertem Write-Concern liefert getWriteConcernError() und getWriteErrors() Fehlerinformationen.
Das Objekt kann nicht manuell instanziiert werden – es wird ausschließlich intern vom Treiber erzeugt. Die Methoden geben je nach Serverantwort und Write-Concern-Konfiguration entweder einen Integer-Wert oder null zurück, wenn der Wert nicht verfügbar ist (etwa bei unacknowledged Writes).
Beispiele
BulkWrite ausführen und Ergebnis auswerten
<?php
$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$bulk = new MongoDB\Driver\BulkWrite(['ordered' => true]);
$id1 = $bulk->insert(['name' => 'Alice', 'age' => 30]);
$id2 = $bulk->insert(['name' => 'Bob', 'age' => 25]);
$bulk->update(
['name' => 'Alice'],
['$set' => ['age' => 31]]
);
$bulk->delete(['name' => 'Bob']);
$writeConcern = new MongoDB\Driver\WriteConcern(
MongoDB\Driver\WriteConcern::MAJORITY,
1000
);
try {
$result = $manager->executeBulkWrite('mydb.users', $bulk, $writeConcern);
echo 'Eingefügt: ' . $result->getInsertedCount() . PHP_EOL;
echo 'Geprüft: ' . $result->getMatchedCount() . PHP_EOL;
echo 'Modifiziert: ' . $result->getModifiedCount() . PHP_EOL;
echo 'Gelöscht: ' . $result->getDeletedCount() . PHP_EOL;
echo 'Upserted: ' . $result->getUpsertedCount() . PHP_EOL;
foreach ($result->getInsertedIds() as $index => $insertedId) {
echo "Dokument #{$index} hat die ID: " . $insertedId . PHP_EOL;
}
} catch (MongoDB\Driver\Exception\BulkWriteException $e) {
$writeResult = $e->getWriteResult();
foreach ($writeResult->getWriteErrors() as $writeError) {
printf(
'Fehler bei Index %d: [%d] %s' . PHP_EOL,
$writeError->getIndex(),
$writeError->getCode(),
$writeError->getMessage()
);
}
} catch (MongoDB\Driver\Exception\Exception $e) {
echo 'Unerwarteter Fehler: ' . $e->getMessage() . PHP_EOL;
}
?>
Upsert erkennen und neue ID auslesen
<?php
$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$bulk = new MongoDB\Driver\BulkWrite();
$bulk->update(
['email' => 'charlie@example.com'],
['$set' => ['name' => 'Charlie', 'email' => 'charlie@example.com']],
['upsert' => true]
);
$result = $manager->executeBulkWrite('mydb.users', $bulk);
if ($result->getUpsertedCount() > 0) {
foreach ($result->getUpsertedIds() as $index => $upsertedId) {
echo 'Neues Dokument per Upsert erstellt, ID: ' . $upsertedId . PHP_EOL;
}
} else {
echo 'Vorhandenes Dokument aktualisiert.' . PHP_EOL;
}
?>
// Wichtig · Fallstricke
Unacknowledged Writes: Wird ein Write-Concern mit w=0 verwendet, liefern viele Getter-Methoden null zurück, da der Server keine Bestätigung sendet. isAcknowledged() gibt in diesem Fall false zurück und der Zugriff auf Zähler-Methoden wirft eine MongoDB\Driver\Exception\BadMethodCallException.
getModifiedCount() vs. getMatchedCount(): getMatchedCount() zählt alle Dokumente, auf die das Filter-Kriterium zutrifft, während getModifiedCount() nur die tatsächlich veränderten Dokumente zählt. Beide Werte können sich unterscheiden, wenn ein Dokument bereits den gewünschten Zustand hatte.
Fehlerbehandlung: Bei Schreibfehlern (z. B. Duplicate-Key-Violation) wird eine MongoDB\Driver\Exception\BulkWriteException geworfen. Das zugehörige WriteResult-Objekt ist dennoch über $e->getWriteResult() abrufbar und enthält die Ergebnisse der bis zum Fehler erfolgreich durchgeführten Operationen.