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

MongoDB\Driver\WriteConcernError

Klasse

Repräsentiert einen Write-Concern-Fehler, der bei einer Schreiboperation auf dem MongoDB-Server aufgetreten ist.

seit PHP 1.0.0 Kategorie: error

Signatur

class MongoDB\Driver\WriteConcernError

Beschreibung

MongoDB\Driver\WriteConcernError kapselt Fehler, die entstehen, wenn der MongoDB-Server die gewünschten Write-Concern-Anforderungen (z. B. Replikation auf eine bestimmte Anzahl von Nodes) nach einer Schreiboperation nicht erfüllen konnte. Das Objekt ist nicht direkt instanziierbar, sondern wird über MongoDB\Driver\WriteResult::getWriteConcernError() zurückgegeben.

Ein Write-Concern-Fehler unterscheidet sich von einem allgemeinen Schreibfehler (MongoDB\Driver\WriteError): Während Schreibfehler anzeigen, dass das Schreiben selbst fehlgeschlagen ist, bedeutet ein Write-Concern-Fehler, dass das Schreiben zwar stattgefunden hat, aber die Replikations- oder Persistenzanforderungen nicht innerhalb des definierten Zeitfensters erfüllt wurden.

Die Klasse implementiert das Interface MongoDB\Driver\Exception\Exception nicht direkt — sie ist kein geworfenes Exception-Objekt, sondern ein reines Datenobjekt, das Fehlerdetails wie Code, Meldung und zugehörige Dokumente enthält. Zur Fehlerbehandlung kombiniert man sie typischerweise mit einem Try-Catch-Block für MongoDB\Driver\Exception\BulkWriteException.

  • getCode() — gibt den MongoDB-Fehlercode zurück
  • getMessage() — gibt die Fehlermeldung zurück
  • getInfo() — gibt ein optionales Dokument mit weiteren Fehlerdetails zurück

Beispiele

Write-Concern-Fehler nach einer Bulk-Schreiboperation auslesen

<?php
$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');

$bulk = new MongoDB\Driver\BulkWrite();
$bulk->insert(['name' => 'Alice', 'age' => 30]);
$bulk->insert(['name' => 'Bob',   'age' => 25]);

// Write-Concern: Bestätigung von mindestens 2 Replica-Set-Mitgliedern,
// Timeout nach 1000 ms — kann zu einem WriteConcernError führen,
// wenn nicht genügend Nodes verfügbar sind.
$writeConcern = new MongoDB\Driver\WriteConcern(2, 1000);

try {
    $result = $manager->executeBulkWrite('testdb.users', $bulk, ['writeConcern' => $writeConcern]);

    $wcError = $result->getWriteConcernError();
    if ($wcError !== null) {
        echo 'Write-Concern-Fehler aufgetreten:' . PHP_EOL;
        echo 'Code:    ' . $wcError->getCode()    . PHP_EOL;
        echo 'Meldung: ' . $wcError->getMessage() . PHP_EOL;
        $info = $wcError->getInfo();
        if ($info !== null) {
            echo 'Info: ' . json_encode((array) $info) . PHP_EOL;
        }
    } else {
        echo 'Alle Dokumente erfolgreich geschrieben und repliziert.' . PHP_EOL;
    }
} catch (MongoDB\Driver\Exception\BulkWriteException $e) {
    $wcError = $e->getWriteResult()->getWriteConcernError();
    if ($wcError !== null) {
        echo 'BulkWriteException — Write-Concern-Fehler:' . PHP_EOL;
        echo 'Code:    ' . $wcError->getCode()    . PHP_EOL;
        echo 'Meldung: ' . $wcError->getMessage() . PHP_EOL;
    } else {
        echo 'Sonstiger BulkWrite-Fehler: ' . $e->getMessage() . PHP_EOL;
    }
} catch (MongoDB\Driver\Exception\Exception $e) {
    echo 'MongoDB-Fehler: ' . $e->getMessage() . PHP_EOL;
}
Write-Concern-Fehler aufgetreten: Code: 64 Meldung: waiting for replication timed out

Write-Concern-Fehler-Details strukturiert ausgeben

<?php
// Hilfsfunktion, um einen WriteConcernError übersichtlich darzustellen
function printWriteConcernError(MongoDB\Driver\WriteConcernError $error): void
{
    echo sprintf(
        "WriteConcernError [%d]: %s\n",
        $error->getCode(),
        $error->getMessage()
    );

    $info = $error->getInfo();
    if ($info !== null) {
        echo 'Details: ' . json_encode($info, JSON_PRETTY_PRINT) . PHP_EOL;
    }
}

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$bulk    = new MongoDB\Driver\BulkWrite();
$bulk->insert(['status' => 'critical']);

$result = $manager->executeBulkWrite(
    'mydb.logs',
    $bulk,
    ['writeConcern' => new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 500)]
);

$wcError = $result->getWriteConcernError();
if ($wcError instanceof MongoDB\Driver\WriteConcernError) {
    printWriteConcernError($wcError);
} else {
    echo 'Kein Write-Concern-Fehler.' . PHP_EOL;
}
Kein Write-Concern-Fehler.

// Wichtig · Fallstricke

Kein Exception-Objekt: WriteConcernError kann nicht mit throw geworfen werden. Es ist ein reines Datenobjekt, das über WriteResult::getWriteConcernError() oder BulkWriteException::getWriteResult()->getWriteConcernError() abgerufen wird.

Unterschied zu WriteError: MongoDB\Driver\WriteError signalisiert, dass ein einzelnes Dokument nicht geschrieben werden konnte (z. B. Duplikat-Key). WriteConcernError bedeutet hingegen, dass das Dokument auf dem primären Node geschrieben wurde, aber die Replikationsgarantien nicht erfüllt werden konnten — die Daten sind also möglicherweise vorhanden, aber nicht garantiert dauerhaft.

Klasse ist final: MongoDB\Driver\WriteConcernError ist nicht erweiterbar und kann nicht manuell instanziiert werden — Objekte dieser Klasse werden ausschließlich intern vom Treiber erstellt.