Signatur
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
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"
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);
// 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.