Visão geral
Neste guia, você pode aprender como criar e interagir com documentos BSON usando a biblioteca PHP.
BSON, ou Binary JSON, é o formato de dados que o MongoDB usa para organizar e armazenar dados. Esse formato de dados inclui todos os tipos de estrutura de dados JSON e também é compatível com outros tipos, incluindo datas, inteiros de tamanhos diferentes, valores ObjectId e dados binários. A biblioteca PHP fornece os tipos MongoDB\Model\BSONArray e MongoDB\Model\BSONDocument para armazenar dados BSON.
Dica
Para ver uma lista completa dos tipos de BSON compatíveis, consulte tipos de BSON no manual do MongoDB Server.
Dados de amostra
Os exemplos de código neste guia referenciam o seguinte documento BSON de exemplo :
{ "address" : { "street" : "Pizza St", "zipcode" : "10003" }, "coord" : [-73.982419, 41.579505] "cuisine" : "Pizza", "name" : "Planet Pizza" }
Crie um documento BSON
Você pode criar um documento BSON usando a mesma notação usada para criar uma array associativa em PHP. A biblioteca PHP converte automaticamente esses valores em documentos BSON ao inseri-los em uma collection.
O exemplo a seguir cria um documento BSON que representa o documento BSON de amostraanterior:
$document = [ 'address' => [ 'street' => 'Pizza St', 'zipcode' => '10003', ], 'coord' => [-73.982419, 41.579505], 'cuisine' => 'Pizza', 'name' => 'Planet Pizza', ];
Altere um documento BSON
Você pode modificar o conteúdo de um documento BSON usando a mesma notação usada para modificar uma array associativa em PHP. Este exemplo faz as seguintes alterações no documento BSON de amostra:
Adiciona um novo campo
restaurant_idque tem um valor de12345Altera o valor do campo
namepara"Galaxy Pizza"
$document['restaurant_id'] = 12345; $document['name'] = 'Galaxy Pizza';
Observação
O código anterior altera apenas os valores na memória do documento BSON de amostra. Ele não executa nenhuma operação de banco de dados que altere valores armazenados no MongoDB. Para saber como modificar documentos armazenados no MongoDB, consulte o guia Atualizar documentos.
Personalizar serialização BSON
As seções a seguir descrevem como configurar a maneira como seu aplicação serializa os dados BSON:
Mapas de tipo: use a opção
typeMappara especificar a conversão padrão entre tipos PHP e tipos BSON.Classes persistentes: use a interface do
MongoDB\BSON\Persistablepara habilitar a serialização.Valores Enum: use os métodos
bsonSerialize()ebsonUnserialize()para especificar a serialização entre enums apoiados e valores BSON.
Tipo Maps
Você pode definir a opção typeMap, que configura a serialização e a desserialização entre os valores PHP e BSON, nos seguintes níveis:
MongoDB\Client, que define o padrão para todas as operações, a menos que sejam substituídasMongoDB\DatabaseMongoDB\Collection
Esta lista também indica a ordem crescente de precedência das configurações de opção. Por exemplo, se você definir um typeMap para uma collection, ela substituirá o map de tipos definido no banco de dados.
A biblioteca PHP usa o seguinte mapa de tipos por padrão:
[ 'array' => 'MongoDB\Model\BSONArray', 'document' => 'MongoDB\Model\BSONDocument', 'root' => 'MongoDB\Model\BSONDocument', ]
Este mapa de tipos executa as seguintes conversões em ambas as direções:
Arrays para
MongoDB\Model\BSONArrayobjetosDocumentos BSON incorporados e de nível superior em objetos
MongoDB\Model\BSONDocument
Um mapa de tipos pode especificar qualquer classe que implemente a interface do MongoDB\BSON\Unserializable. Ele também pode especificar conversões dos tipos array, stdClass e object.
Exemplo de mapa de tipo personalizado
O exemplo a seguir define a opção typeMap para a collection restaurants que serializa arrays e documentos BSON como objetos MongoDB\Model\BSONDocument:
$options = [ 'typeMap' => [ 'array' => 'MongoDB\Model\BSONDocument', 'root' => 'MongoDB\Model\BSONDocument', 'document' => 'MongoDB\Model\BSONDocument', ], ]; $db->createCollection('restaurants', $options);
Classes persistentes
Você pode criar classes que implementam a interface MongoDB\BSON\Persistable. Essa interface instrui a biblioteca PHP a executar automaticamente a serialização e a desserialização de acordo com a especificação de persistência da extensão PHP, sem exigir a opção typeMap. A interface Persistable é análoga à interface Serializable do PHP.
Ao desserializar uma variável PHP a partir de BSON, o nome de classe codificado de um objeto Persistable substitui qualquer classe especificada na opção typeMap. No entanto, ele não substitui os tipos array, stdClass ou object.
Exemplo
Considere a seguinte definição de classe Person, que implementa a interface Persistable e especifica como serializar e desserializar campos de objeto como valores BSON:
class Person implements MongoDB\BSON\Persistable { private \MongoDB\BSON\ObjectId $id; private \MongoDB\BSON\UTCDateTime $createdAt; public function __construct(private string $name) { $this->id = new \MongoDB\BSON\ObjectId(); $this->createdAt = new \MongoDB\BSON\UTCDateTime(); } public function bsonSerialize(): array { return [ '_id' => $this->id, 'name' => $this->name, 'createdAt' => $this->createdAt, ]; } public function bsonUnserialize(array $data): void { $this->id = $data['_id']; $this->name = $data['name']; $this->createdAt = $data['createdAt']; } }
O exemplo a seguir constrói um objeto Person , insere-o no banco de dados e o lê de volta como um objeto do mesmo tipo:
$collection = $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) } }
O documento retornado é equivalente ao seguinte documento BSON :
{ "_id" : ObjectId("56fad2c36118fd2e9820cfc1"), "__pclass" : BinData(128,"UGVyc29u"), "name" : "Bob", "createdAt" : ISODate("2016-03-29T19:08:51.218Z") }
A biblioteca PHP adiciona automaticamente o campo __pclass para acompanhar o nome da classe correspondente do documento, o que permite desserializar o documento em um objeto Person .
Observação
Você pode usar a interface Persistable apenas para documentos BSON raiz e incorporados, não para arrays BSON.
Enum Values
Você pode serializar e desserializar enums apoiados em dados BSON. Os valores de enumeração apoiados são serializados como seu valor de caso, enquanto enums puros sem valores de caso não podem ser serializados diretamente. Para executar estas conversões, você deve especificar a lógica de serialização definindo os métodos bsonSerialize() e bsonUnserialize() em sua definição de classe .
Dica
Para saber mais sobre enums apoiados, consulte Enums apoiados na documentação da extensão PHP.
Exemplo
Considere o seguinte enumeração apoiado denominado Role, que tem dois casos com valor inteiro:
enum Role: int { case USER = 1; case ADMIN = 2; }
Esta definição de classe User inclui um campo role com um valor de enumeração Role e especifica a lógica para serializar e desserializar seus campos em valores BSON:
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']); } }
O exemplo a seguir constrói um objeto User com um campo role , insere no banco de dados e o lê de volta como um objeto do mesmo tipo:
$collection = $client->test->users; $result = $collection->insertOne(new User('alice', Role::USER)); $person = $collection->findOne(['_id' => $result->getInsertedId()]); var_dump($person);
object(User)#40 (3) { ["username":"User":private]=> string(5) "alice" ["role":"User":private]=> enum(Role::USER) ["_id":"User":private]=> object(MongoDB\BSON\ObjectId)#38 (1) { ["oid"]=> string(24) "..." } }
Observação
Os enums não podem implementar as interfaces MongoDB\BSON\Unserializable e MongoDB\BSON\Persistable porque os casos de enumeração não têm estado e não podem ser instanciados como objetos de classe . No entanto, enums puros e apoiados podem implementar MongoDB\BSON\Serializable, que você pode usar para substituir o comportamento de serialização de enumeração padrão.
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos da biblioteca PHP discutidos neste guia, consulte a seguinte documentação da API da biblioteca:
Para saber mais sobre os tipos de extensão PHP discutidos neste guia, consulte a seguinte documentação da API de extensão: