문서 메뉴

문서 홈PHP 라이브러리 매뉴얼

BSON 데이터 모델링

이 페이지의 내용

  • 유형 맵
  • 지속 가능한 클래스
  • 열거형으로 작업하기

MongoDB에서 데이터를 읽는 대부분의 메서드는 BSON이 PHP로 변환되는 방식을 제어할 수 있는 typeMap 옵션을 지원합니다. 또한 MongoDB\Client, MongoDB\DatabaseMongoDB\Collection 클래스는 typeMap 옵션을 허용하며, 이 옵션을 사용하여 모든 지원 메서드 및 선택한 클래스에 적용할 기본 유형 맵을 지정할 수 있습니다(예: MongoDB\Client::selectDatabase()).

MongoDB\Client, MongoDB\DatabaseMongoDB\Collection 클래스는 기본적으로 다음 유형 맵을 사용합니다.

[
'array' => 'MongoDB\Model\BSONArray',
'document' => 'MongoDB\Model\BSONDocument',
'root' => 'MongoDB\Model\BSONDocument',
]

위의 유형 맵은 BSON 문서와 배열을 각각 MongoDB\Model\BSONDocumentMongoDB\Model\BSONArray 객체로 변환합니다. rootdocument 키는 최상위 BSON 문서와 내장된 문서를 각각 구별하는 데 사용됩니다.

유형 맵은 MongoDB\BSON\Unserializable 를 구현하는 모든 클래스를 지정할 수 "array" "stdClass있습니다. , ","object" ("stdClass" 과 "object" 는 서로의 별칭입니다).

다음도 참조하세요.

BSON에서 역직렬화 PHP 매뉴얼에서

드라이버의 지속성 사양 클래스가 MongoDB\BSON\Persistable 인터페이스는 BSON으로 직렬화 및 역직렬화됩니다. 지속 가능 인터페이스는 PHP의 직렬화 가능 인터페이스와 유사합니다.

드라이버가 Persistable 을 구현하는 클래스에 대한 직렬화 및 역직렬화를 자동으로 처리합니다. 옵션을 사용할 필요 없이 인터페이스를 사용할 수 typeMap 있습니다. 이는 BSON 문서 내의 특수 속성에 PHP 클래스 이름을 인코딩하여 수행됩니다.

참고

BSON 에서 PHP 변수를 역직렬화할 때 인코딩된 클래스 이름은 다음과 같습니다. 객체는 유형 맵에 지정된 모든 클래스를 재정의하지만 "array""stdClass" 또는 은 재정의하지 "object" 않습니다. 이는 지속성 사양 에서 설명합니다. 그러나 반복되는 것을 참습니다.

다음 클래스 정의를 고려하세요.

<?php
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 객체를 생성하여 데이터베이스에 삽입한 다음 동일한 유형의 객체로 다시 읽습니다.

<?php
$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과 함께 사용할 수 있으며 대소문자 값(예: 정수 또는 문자열)으로 직렬화됩니다.순수 열거형 지원되는 케이스가 없는 는 직접 직렬화할 수 없습니다. 이는 json_encode()가 열거형을 처리하는 방식과 유사합니다.

BSON을 통한 백업 열거형 왕복 작업에는 특별한 처리가 필요합니다. 다음 예제에서 열거형을 포함하는 클래스의 bsonUnserialize() 메서드는 값을 열거형 케이스로 다시 변환하는 역할을 합니다.

<?php
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 구현할 수 있습니다. 이는 지원되는 열거형이 대/소문자 값으로 직렬화되고 순수 열거형이 직렬화될 수 없는 기본 동작을 해결하는 데 사용할 수 있습니다.

← Bref를 사용하여 AWS Lambda에 배포