Start · Sprachen · PHP · Referenz · MongoDB\BSON\ObjectId

MongoDB\BSON\ObjectId

Klasse

Repräsentiert eine eindeutige BSON-ObjectId, die typischerweise als Primärschlüssel in MongoDB-Dokumenten verwendet wird.

Kategorie: db

Signatur

class MongoDB\BSON\ObjectId implements MongoDB\BSON\ObjectIdInterface, MongoDB\BSON\Type, Serializable, JsonSerializable, Stringable

Beschreibung

MongoDB\BSON\ObjectId kapselt den 12-Byte-BSON-Typ ObjectId, der in MongoDB standardmäßig als _id-Feld neuer Dokumente genutzt wird. Die ObjectId enthält einen 4-Byte-Unix-Zeitstempel (Sekunden seit Epoch), eine 5-Byte-Zufallskomponente und einen 3-Byte-inkrementellen Zähler, was eine praktisch kollisionsfreie Erzeugung ohne zentralen Koordinator erlaubt.

Wird dem Konstruktor kein Argument übergeben, generiert PHP automatisch eine neue, eindeutige ObjectId. Alternativ kann eine bestehende 24-stellige hexadezimale Zeichenkette übergeben werden, um eine ObjectId aus einem gespeicherten Wert zu rekonstruieren – z. B. beim Lesen aus einer URL oder einem JSON-Body.

Die Klasse implementiert Stringable, sodass eine ObjectId direkt in String-Kontexten (z. B. echo, String-Interpolation) als 24-stellige Hex-Zeichenkette ausgegeben werden kann. Über getTimestamp() lässt sich der Erstellungszeitpunkt des Dokuments ohne zusätzliches Datenbankfeld rekonstruieren.

ObjectId-Objekte sind unveränderlich (immutable). Sie werden bei der Serialisierung korrekt behandelt und lassen sich problemlos in JSON-Antworten einbetten, da JsonSerializable implementiert ist.

Parameter

Name Typ Default Beschreibung
$id string|null null Eine 24-stellige hexadezimale Zeichenkette, die eine bestehende ObjectId repräsentiert. Wird null oder kein Wert übergeben, wird automatisch eine neue ObjectId generiert.

Rückgabewert

Typ

Beispiele

Neue ObjectId generieren und als String ausgeben

<?php
use MongoDB\BSON\ObjectId;

// Neue, automatisch generierte ObjectId
$oid = new ObjectId();
echo $oid . PHP_EOL;                     // z. B. 6642f1a3e4b0c9d8f7e123ab
echo $oid->getTimestamp() . PHP_EOL;     // Unix-Zeitstempel der Erzeugung, z. B. 1715620259

// Prüfen, ob es ein gültiger String ist
var_dump((string) $oid);                 // string(24) "6642f1a3e4b0c9d8f7e123ab"
6642f1a3e4b0c9d8f7e123ab 1715620259 string(24) "6642f1a3e4b0c9d8f7e123ab"

Bestehende ObjectId aus URL-Parameter rekonstruieren

<?php
use MongoDB\BSON\ObjectId;
use MongoDB\Driver\Manager;
use MongoDB\Driver\Query;

// Simulierter URL-Parameter, z. B. /artikel/6642f1a3e4b0c9d8f7e123ab
$rawId = '6642f1a3e4b0c9d8f7e123ab';

try {
    $oid = new ObjectId($rawId);
} catch (\MongoDB\Driver\Exception\InvalidArgumentException $e) {
    // Ungültige Hex-Zeichenkette abfangen
    http_response_code(400);
    exit('Ungültige Dokument-ID');
}

$manager = new Manager('mongodb://localhost:27017');
$query   = new Query(['_id' => $oid]);
$cursor  = $manager->executeQuery('meineDatenbank.artikel', $query);

foreach ($cursor as $dokument) {
    echo $dokument->titel . PHP_EOL;
}

ObjectId in JSON-Antwort einbetten

<?php
use MongoDB\BSON\ObjectId;

$oid  = new ObjectId('6642f1a3e4b0c9d8f7e123ab');
$data = [
    'id'    => $oid,           // JsonSerializable greift hier
    'titel' => 'Hallo Welt',
];

echo json_encode($data, JSON_PRETTY_PRINT);
{ "id": { "$oid": "6642f1a3e4b0c9d8f7e123ab" }, "titel": "Hallo Welt" }

// Wichtig · Fallstricke

Eingabevalidierung: Wird eine Zeichenkette übergeben, die keine gültige 24-stellige Hex-Darstellung ist, wirft der Konstruktor eine MongoDB\Driver\Exception\InvalidArgumentException. Nutzereingaben sollten daher immer in einem try/catch-Block verarbeitet werden, um HTTP-400-Fehler korrekt zurückgeben zu können.

Vergleich: Zwei ObjectId-Objekte können nicht direkt mit == verglichen werden, wenn sie aus verschiedenen Instanzen stammen. Stattdessen sollte der String-Vergleich (string) $a === (string) $b verwendet werden.

Zeitstempel-Auflösung: getTimestamp() liefert nur Sekunden-Genauigkeit. Mehrere ObjectIds, die innerhalb derselben Sekunde erzeugt werden, haben denselben Zeitstempel; die Eindeutigkeit ist dennoch durch die Zufallskomponente und den Zähler gewährleistet.