BSON データのモデリング
タイプ マップ
MongoDB からデータを読み取るほとんどのメソッドは typeMap
オプションをサポートしています。これにより、BSON を PHP に変換する方法を制御できます。 さらに、 MongoDB\Client
、 MongoDB\Database
、およびMongoDB\Collection
クラスはtypeMap
オプションを受け入れます。このオプションは、サポートしているメソッドと選択したクラス(例: MongoDB\Client::selectDatabase()
)。
MongoDB\Client
、 MongoDB\Database
、 MongoDB\Collection
クラスは、デフォルトで次の型マップを使用します。
[ 'array' => 'MongoDB\Model\BSONArray', 'document' => 'MongoDB\Model\BSONDocument', 'root' => 'MongoDB\Model\BSONDocument', ]
上記のタイプ マップは、BSON ドキュメントと配列をそれぞれMongoDB\Model\BSONDocument
} オブジェクトとMongoDB\Model\BSONArray
オブジェクトに変換します。 root
キーとdocument
キーは、それぞれ最上位の BSON ドキュメントと埋め込みドキュメントを区別するために使用されます。
型マップには、 MongoDB\BSON\Unserializationable を実装する任意のクラスを指定できます"array"
また、 、"stdClass
"、"object"
("stdClass
" と"object"
は のエイリアスです)。
永続的なクラス
拡張機能の 永続性仕様 は、 MongoDB\BSON\Perstable を実装するクラスの概要を示します。 インターフェースは BSON にシリアル化され、BSON から逆シリアル化されます。永続的な インターフェースは、PHP の シリアル化可能なインターフェースに類似しています。
拡張機能は、 永続性 があるクラスの直列化と逆直列化を自動的に処理します typeMap
オプションを使用する必要がないインターフェース。これは、BSON ドキュメント内の特別なプロパティに PHP クラスの名前をエンコードすることで行われます。
注意
BSON から PHP 変数を逆直列化する場合、 永続可能 な オブジェクトはタイプ"array"
マップで指定されたクラスを上書きしますが、 と"stdClass"
または"object"
は上書きされません。これは 永続性の仕様 で説明されています しかし、繰り返しが含まれます。
次のクラス定義を考慮します。
class Person implements MongoDB\BSON\Persistable { private MongoDB\BSON\ObjectId $id; private string $name; private MongoDB\BSON\UTCDateTime $createdAt; public function __construct(string $name) { $this->id = new MongoDB\BSON\ObjectId; $this->name = $name; $this->createdAt = new MongoDB\BSON\UTCDateTime; } function bsonSerialize() { return [ '_id' => $this->id, 'name' => $this->name, 'createdAt' => $this->createdAt, ]; } function bsonUnserialize(array $data) { $this->id = $data['_id']; $this->name = $data['name']; $this->createdAt = $data['createdAt']; } }
次の例では、 Person
オブジェクトを構築し、 データベースに挿入し、同じタイプのオブジェクトとして読み取ります。
$collection = (new MongoDB\Client)->test->persons; $result = $collection->insertOne(new Person('Bob')); $person = $collection->findOne(['_id' => $result->getInsertedId()]); var_dump($person);
出力は次のようになります。
object(Person)#18 (3) { ["id":"Person":private]=> object(MongoDB\BSON\ObjectId)#15 (1) { ["oid"]=> string(24) "56fad2c36118fd2e9820cfc1" } ["name":"Person":private]=> string(3) "Bob" ["createdAt":"Person":private]=> object(MongoDB\BSON\UTCDateTime)#17 (1) { ["milliseconds"]=> int(1459278531218) } }
MongoDB shell では同じドキュメントが次のように表示される場合があります。
{ "_id" : ObjectId("56fad2c36118fd2e9820cfc1"), "__pclass" : BinData(128,"UGVyc29u"), "name" : "Bob", "createdAt" : ISODate("2016-03-29T19:08:51.218Z") }
注意
MongoDB\BSON\Persistable は、ルートおよび埋め込み BSON ドキュメントにのみ使用できます。BSON 配列には使用できない場合があります。
列挙型の操作
バックアップ列挙 は BSON で使用でき、ケース値としてシリアル化されます(つまり整数または string)のどちらでも構いません。 単純列挙 は、バックグラウンド ケースがないため、直接シリアル化することはできません。これは、 json_encode() によって列挙型が処理される方法と同様です。
BSON を介してバックグラウンド列挙をラウンドトリップするには、特別な処理が必要です。 次の例では、列挙型を含むクラスのbsonUnserialize()
メソッドが、値を列挙ケースに戻すのを担当しています。
enum Role: int { case USER = 1; case ADMIN = 2; } class User implements MongoDB\BSON\Persistable { public function __construct( private string $username, private Role $role, private MongoDB\BSON\ObjectId $_id = new MongoDB\BSON\ObjectId(), ) {} public function bsonSerialize(): array { return [ '_id' => $this->_id, 'username' => $this->username, 'role' => $this->role, ]; } public function bsonUnserialize(array $data): void { $this->_id = $data['_id']; $this->username = $data['username']; $this->role = Role::from($data['role']); } }
列挙型は MongoDB\BSON\Unserializeable の実装を禁止されています および MongoDB\BSON\Persistable 、列挙型のケースには状態がなく、通常のオブジェクトのようにインスタンス化できないためです。ただし、単純な列挙型とバッキングされた列挙型では MongoDB\BSON\Serializeable は実装できます 、これを使用すると、バックアップされた列挙型がケース値としてシリアル化され、単一の列挙型がシリアル化できないというデフォルトの動作を回避できます。