Página inicial do Docs → Manual da Biblioteca PHP
Guia de atualização de driver legado
Nesta página
Visão geral
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.
BSON
Classes de tipo
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.
[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. |
Emulando o driver legado
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:
$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" }
API de collection
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 | MongoDB\Collection método(s) |
---|---|
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() | MongoDB\Collection::insertOne() ou MongoDB\Collection::replaceOne() com a opção upsert . |
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. |
Acessando ID de documento inseridos
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:
Operações de gravação em massa
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() Removido
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.
Auxiliar de comando de grupo
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()
:
$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];