BSON 데이터 모델링
이 페이지의 내용
유형 맵
MongoDB 에서 데이터를 읽는 대부분의 메서드는 BSON 이 PHP 로 변환되는 방식을 제어할 수 있는 typeMap
옵션을 지원 합니다. 또한 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\Unserializable 를 구현하는 모든 클래스를 지정할 수 "array"
"stdClass
있습니다. , ","object"
("stdClass
" 와 "object"
은 서로의 별칭입니다).
지속 가능한 클래스
확장 프로그램의 지속성 사양 클래스가 MongoDB\ BSON\Persistable 을 구현하는 방법을 간략하게 설명합니다. 인터페이스는 BSON 에서 직렬화 및 역직렬화됩니다. 지속 가능 인터페이스는 PHP의 직렬화 가능 인터페이스와 유사합니다.
이 확장은 Persistable 을 구현하는 클래스에 대한 직렬화 및 역직렬화를 자동으로 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\Unserializable 을 구현할 수 없습니다. 및 MongoDB\BSON\Persistable 열거형 사례에는 상태가 없고 일반 객체처럼 인스턴스화할 수 없기 때문입니다. 그러나 순수 열거형과 지원되는 열거형은 MongoDB\BSON\Serializable 을 구현할 수 있습니다. 이는 지원되는 열거형이 대/소문자 값으로 직렬화되고 순수 열거형이 직렬화될 수 없는 기본 동작을 해결하는 데 사용할 수 있습니다.