Menu Docs
Página inicial do Docs
/ /

Trabalhe com Dados BSON

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.

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"
}

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',
];

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_id que tem um valor de 12345

  • Altera o valor do campo name para "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.

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 typeMap para especificar a conversão padrão entre tipos PHP e tipos BSON.

  • Classes persistentes: use a interface do MongoDB\BSON\Persistable para habilitar a serialização.

  • Valores Enum: use os métodos bsonSerialize() e bsonUnserialize() para especificar a serialização entre enums apoiados e valores BSON.

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ídas

  • MongoDB\Database

  • MongoDB\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\BSONArray objetos

  • Documentos 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.

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);

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.

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.

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.

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.

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:

Voltar

Decimal128

Nesta página