Start · Sprachen · PHP · Referenz · MongoDB\Driver\WriteResult

MongoDB\Driver\WriteResult

Klasse

Repräsentiert das Ergebnis einer Schreiboperation (Insert, Update, Delete, BulkWrite) gegen einen MongoDB-Server.

seit PHP 1.0.0 Kategorie: db

Signatur

class MongoDB\Driver\WriteResult

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;
}
?>
Eingefügt: 2 Geprüft: 1 Modifiziert: 1 Gelöscht: 1 Upserted: 0 Dokument #0 hat die ID: 6650a1e2b7c9f30001234567 Dokument #1 hat die ID: 6650a1e2b7c9f30001234568

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;
}
?>
Neues Dokument per Upsert erstellt, ID: 6650a2f0c3d1e40002345678

// 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.