Menu Docs

Página inicial do DocsManual da Biblioteca PHP

Guia de atualização de driver legado

Nesta página

  • Visão geral
  • BSON
  • Classes de tipo
  • Emulando o driver legado
  • API de collection
  • Acessando ID de documento inseridos
  • Operações de gravação em massa
  • MongoCollection::save() Removido
  • Auxiliar de comando de grupo

A biblioteca PHP do MongoDB e aextensão subjacente têm diferenças notáveis de API em relação à mongo extensão herdada. Esta página resumirá essas diferenças para o benefício daqueles que estão atualizando do driver legado.

Além disso, um mongo-php-adapter desenvolvido pela comunidade existe uma biblioteca que implementa a mongo API de extensão usando essa biblioteca e o novo driver. Embora essa biblioteca de adaptadores não seja oficialmente suportada pelo MongoDB, ela vale a pena ser mencionada.

Ao atualizar a partir do driver legado, classes de tipo como MongoId devem ser substituídas por classes no namespace MongoDB\BSON. O novo driver também apresenta interfaces para seus tipos de BSON, que devem ser preferidos se os aplicativos precisarem digitar dica em relação aos valores de BSON.

A tabela a seguir lista todas as classes de legado juntamente com a classe equivalente no novo driver.

Classe legada
classe de tipo de BSON
Interface do tipo de BSON
Mongoid
MongoCode
MongoDate
MongoRegex
MongoBinData
MongoInt32
Não implementado. [1]
MongoInt64
Não implementado. [2]
MongoDBRef
Não implementado. [3]
MongoMinKey
MongoMaxKey
MongoTimestamp
[1] O novo driver não implementa uma classe equivalente para MongoInt32. Ao decodificar BSON, números inteiros de 32 bits sempre serão representados como um número inteiro PHP. Ao codificar BSON, os números inteiros PHP codificarão como um número inteiro de 32 bits ou 64 bits, dependendo de seu valor.
[2] MongoDB\BSON\Int64 não tem uma interface definida. O novo driver não permite que aplicativos instanciem esse tipo (ou seja, seu construtor é privado) e ele só é criado durante a decodificação BSON quando 64um número inteiro bits não pode ser representado como um número inteiro PHP em uma 32plataforma bits.
[3](1, 2, 3) O novo driver não implementa uma classe equivalente para MongoDBRef, pois DBRefs são apenas um documento BSON com uma estrutura específica e não um tipo BSON adequado. O novo driver também não fornece quaisquer auxiliares para trabalhar com objetos DBRef, uma vez que seu uso não é encorajado.

A extensão legado de mongo retornou documento e arrays BSON como arrays PHP. Embora as arrays PHP sejam convenientes para trabalhar, esse comportamento era problemático:

  • Diferentes BSON types podem desserializar para o mesmo valor PHP (por exemplo {"0": "foo"} e ["foo"]), o que tornou impossível inferir o tipo de BSON original.

  • Arrays PHP indexadas numericamente seriam serializadas como documentos BSON se houver uma lacuna em sua sequência de chaves. Essas lacunas eram causadas por desconfigurar uma chave para remover um elemento e esquecer de reindexar numericamente a array.

As classes BSONDocument e BSONArray da biblioteca PHP do MongoDB abordam essas preocupações preservando as informações do tipo de BSON durante a serialização e a desserialização; no entanto, alguns usuários ainda podem preferir o comportamento legado. Se desejar, você pode usar a opção typeMap para que a biblioteca retorne tudo como uma array PHP:

<?php
$client = new MongoDB\Client(
'mongodb://127.0.0.1/',
[],
[
'typeMap' => [
'array' => 'array',
'document' => 'array',
'root' => 'array',
],
]
);
$document = $client->test->zips->findOne(['_id' => '94301']);
var_dump($document);

O exemplo acima produziria algo semelhante a:

array(5) {
["_id"]=>
string(5) "94301"
["city"]=>
string(9) "PALO ALTO"
["loc"]=>
array(2) {
[0]=>
float(-122.149685)
[1]=>
float(37.444324)
}
["pop"]=>
int(15965)
["state"]=>
string(2) "CA"
}

A classe desta biblioteca MongoDB\Collection implementa o CRUD entre drivers do MongoDB e gerenciamento de índices especificações. Embora alguns nomes de método tenham sido alterados de acordo com as novas especificações, a nova classe fornece a mesma funcionalidade que a classe MongoCollection do driver legado, com algumas exceções notáveis.

Um princípio orientador ao projetar as novas APIs era que nomes explícitos de métodos são preferíveis aos termos sobrecarregados encontrados na API antiga. Por exemplo, MongoCollection::save() e MongoCollection::findAndModify() têm modos de operação diferentes, dependendo de seus argumentos. Os métodos também foram divididos para distinguir entre a atualização de campos específicos e a substituição completa do documento.

A tabela a seguir lista todos os métodos legados juntamente com o(s) método(s) equivalente(s) no novo driver.

Método MongoCollection
MongoCollection::aggregate()
MongoCollection::aggregateCursor()
MongoCollection::batchInsert()
MongoCollection::count()
MongoCollection::createDBRef()
Ainda não implementado. [3]
MongoCollection::createIndex()
MongoCollection::deleteIndex()
MongoCollection::deleteIndexes()
MongoCollection::drop()
MongoCollection::distinct()
MongoCollection::ensureIndex()
MongoCollection::find()
MongoCollection::findAndModify()
MongoCollection::findOne()
MongoCollection::getDBRef()
Não implementado. [3]
MongoCollection::getIndexInfo()
MongoCollection::getName()
MongoCollection::getReadPreference()
MongoCollection::getSlaveOkay()
Não implementado.
MongoCollection::getWriteConcern()
MongoCollection::group()
Não implementado. Usar MongoDB\Database::command(). Consulte Auxiliar de comando de grupo para obter um exemplo.
MongoCollection::insert()
MongoCollection::parallelCollectionScan()
Não implementado.
MongoCollection::remove()
MongoCollection::save()
MongoCollection::setReadPreference()
Não implementado. Use MongoDB\Collection::withOptions().
MongoCollection::setSlaveOkay()
Não implementado.
MongoCollection::setWriteConcern()
Não implementado. Use MongoDB\Collection::withOptions().
MongoCollection::update()
MongoCollection::validate()
Não implementado.

No driverMongoCollection::insert() legado, MongoCollection::batchInsert(), e MongoCollection::save() (ao inserir) modificariam seu argumento de entrada injetando uma _id chave com um ObjectId gerado (ou seja, objeto MongoId). Esse comportamento foi meio que um esquema, pois não dependia do argumento passado por referência; em vez disso, ele modificou diretamente a memória por meio da API de extensão e não pôde ser implementado no usuário do PHP. Dessa forma, isso não é mais feito no novo driver e na biblioteca.

As ID de documento inseridos (gerados ou não) podem ser acessadas por meio dos seguintes métodos nos objeto de resultado da gravação:

As classes MongoWriteBatch do driver legado foram substituídas por um método MongoDB\Collection::bulkWrite() de uso geral. Enquanto o driver legado só permitia operações em massa do mesmo tipo, o novo método permite que operações sejam mistas (por exemplo inserções, atualizações e exclusões).

MongoCollection::save(), que era o açúcar sintático para uma operação de inserção ou upsert, foi removido em favor do uso explícito de MongoDB\Collection::insertOne() ou MongoDB\Collection::replaceOne() (com a opção upsert ).

Embora o save método tenha sua utilidade para ambientes interativos, como o shell do MongoDB, ele foi intencionalmente excluído da especificação CRUD para drivers de idioma. Geralmente, o código do aplicativo deve saber se o documento tem um identificador e ser capaz de inserir ou substituir explicitamente o documento e lidar com o MongoDB\InsertOneResult ou MongoDB\UpdateResult retornado, respectivamente. Isso também ajuda a evitar substituições inadvertidas e potencialmente perigosas de documentos completos.

MongoDB\Collection não tem um método auxiliar para o comando de grupo . O exemplo seguinte demonstra como executar um comando de grupo utilizando o método MongoDB\Database::command() :

<?php
$database = (new MongoDB\Client)->selectDatabase('db_name');
$cursor = $database->command([
'group' => [
'ns' => 'collection_name',
'key' => ['field_name' => 1],
'initial' => ['total' => 0],
'$reduce' => new MongoDB\BSON\Javascript('...'),
],
]);
$resultDocument = $cursor->toArray()[0];
← Stable API