Criar, ler, atualizar e excluir documentos MongoDB com PHP
Avalie esse Início rápido
Bem-vindo à parte 2 deste guia de início rápido para MongoDB e PHP. No artigo anterior, descrevi o processo de instalação, configuração e configuração do PHP, do Apache e do driver e da extensão do MongoDB para que você possa começar efetivamente a criar um aplicativo usando a pilha do PHP e MongoDB.
É altamente recomendável visitar o primeiro artigo desta série para ser configurado corretamente, caso você não tenha instalado anteriormente o PHP e o Apache.
Criei cada seção com amostras de código. E estou certo de que me pareço com você no sentido de queadoro quando um tutorial inclui exemplos autônomos... Eles podem ser copiados/coledos e testados rapidamente. Portanto, procurei garantir que cada exemplo fosse criado de forma pronta para ser executada.
Essas amostras estão disponíveis neste repositórioe cada amostra de código é um programa independente que você pode executar por si só. Para executar as amostras, você precisará ter instalado o PHP, versão 8 e você precisará ser capaz de instalar bibliotecas PHP adicionais utilizando
Compose
. Todas essas etapas são abordadas no primeiro artigo desta série.Além disso, embora eu aborde esse assunto neste artigo, vale a pena mencionar antecipadamente que você precisará criar e usar um arquivo
.env
com suas credenciais e o nome do servidor do seu cluster do MongoDB Atlas.Este guia está organizado em algumas seções em alguns artigos. Este primeiro artigo aborda a instalação e a configuração do seu ambiente de desenvolvimento. PHP é uma linguagem de desenvolvimento web integrada. Há vários componentes que você normalmente usa em conjunto com a linguagem de programação PHP.
Introdução e visão geral do vídeo
Vamos começar com uma visão geral do que abordaremos neste artigo.
Para se conectar a um cluster do MongoDB Atlas, use a string de conexão do Atlas para seu cluster:
1 2 3 $client = new MongoDB\Client( 4 'mongodb+srv://<username>:<password>@<cluster-address>/test?w=majority' 5 ); 6 $db = $client->test;
Apenas uma observação sobre o idioma. Neste artigo, usamos o termo
create
e insert
forma intercambiável. Estes dois termos são sinônimos. Anteriormente, o ato de adicionar dados a um banco de dados era conhecido como CREATING
. Portanto, a sigla CRUD
significa Criar, Ler, Atualizar e Excluir. Apenas saiba que quando usamos criar ou inserir, queremos dizer a mesma coisa.Quando nos conectamos ao MongoDB, precisamos especificar nossas credenciais como parte da connection string. Você pode codificar esses valores em seus programas, mas quando você confirma seu código em um repositório de código-fonte, está expondo suas credenciais a quem quer que seja que você dê acesso a esse repositório. Se você estiver trabalhando com código aberto, isso significa que o mundo tem acesso às suas credenciais. Esta não é uma boa ideia. Portanto, para proteger suas credenciais, nós as armazenamos em um arquivo que não não são verificados em seu repositório de código-fonte. A prática comum exige que armazenemos essas informações apenas no ambiente. Um método comum de fornecer esses valores para o ambiente de execução do seu programa é colocar credenciais e outros dados confidenciais em um arquivo
.env
.1 MDB_USER="yourusername" 2 MDB_PASS="yourpassword" 3 ATLAS_CLUSTER_SRV="mycluster.zbcul.mongodb.net"
Para criar seu próprio arquivo de ambiente, crie um arquivo chamado
.env
na raiz do seu diretório de programa. Você pode simplesmente copiar o arquivo de ambiente de exemplo que forneci e renomeá-lo para .env
. Certifique-se de substituir os valores no arquivo yourusername
, yourpassword
e mycluster.zbcul.mongodb.net
pelos seus.Depois que o arquivo de ambiente estiver em vigor, você poderá usar
Composer
para instalar a biblioteca DotEnv, o que nos permitirá ler essas variáveis no ambiente do nosso programa. Consulte o primeiro artigo desta série para obter instruções de configuração adicionais.1 $ composer require vlucas/phpdotenv
Depois de instalada, você pode incorporar essa biblioteca ao seu código para extrair os valores do seu arquivo
.env
.1 $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); 2 $dotenv->load();
Em seguida, você poderá referenciar os valores do arquivo
.env
utilizando a array$_ENV[]
como esta:1 echo $_ENV['MDB_USER'];
Veja os exemplos de código abaixo para ver isso em ação.
O método MongoDBCollection::insertOne() insere um único documento no MongoDB e retorna uma instância de MongoDBInsertOneResult, que você pode usar para acessar o ID do documento inserido.
1 2 3 require_once __DIR__ . '/vendor/autoload.php'; 4 $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); 5 $dotenv->load(); 6 7 $client = new MongoDB\Client( 8 'mongodb+srv://'.$_ENV['MDB_USER'].':'.$_ENV['MDB_PASS'].'@'.$_ENV['ATLAS_CLUSTER_SRV'].'/test' 9 ); 10 11 $collection = $client->test->users; 12 13 $insertOneResult = $collection->insertOne([ 14 'username' => 'admin', 15 'email' => 'admin@example.com', 16 'name' => 'Admin User', 17 ]); 18 19 printf("Inserted %d document(s)\n", $insertOneResult->getInsertedCount()); 20 21 var_dump($insertOneResult->getInsertedId());
Você deverá ver algo semelhante a:
1 Inserted 1 document(s) 2 object(MongoDB\BSON\ObjectId)#11 (1) { 3 ["oid"]=> 4 string(24) "579a25921f417dd1e5518141" 5 }
A saída inclui a ID do documento inserido.
O método MongoDBCollection::insertMany() permite inserir vários documentos em uma operação de escrita e retorna uma instância do MongoDBInsertManyResult, que você pode usar para acessar as IDs dos documentos inseridos.
O código de exemplo a seguir insere dois documentos na coleta de usuários no banco de dados de teste:
1 2 3 require_once __DIR__ . '/vendor/autoload.php'; 4 $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); 5 $dotenv->load(); 6 7 $client = new MongoDB\Client( 8 'mongodb+srv://'.$_ENV['MDB_USER'].':'.$_ENV['MDB_PASS'].'@'.$_ENV['ATLAS_CLUSTER_SRV'].'/test' 9 ); 10 11 $collection = $client->test->users; 12 13 $insertManyResult = $collection->insertMany([ 14 [ 15 'username' => 'admin', 16 'email' => 'admin@example.com', 17 'name' => 'Admin User', 18 ], 19 [ 20 'username' => 'test', 21 'email' => 'test@example.com', 22 'name' => 'Test User', 23 ], 24 ]); 25 26 printf("Inserted %d document(s)\n", $insertManyResult->getInsertedCount()); 27 28 var_dump($insertManyResult->getInsertedIds());
Você deverá ver algo semelhante a isto:
1 Inserted 2 document(s) 2 array(2) { 3 [0]=> 4 object(MongoDB\BSON\ObjectId)#18 (1) { 5 ["oid"]=> 6 string(24) "6037b861301e1d502750e712" 7 } 8 [1]=> 9 object(MongoDB\BSON\ObjectId)#21 (1) { 10 ["oid"]=> 11 string(24) "6037b861301e1d502750e713" 12 } 13 }
A leitura de documentos de um banco de MongoDB database pode ser realizada de várias maneiras, mas a mais simples é usar o comando
$collection->find()
.1 function find($filter = [], array $options = []): MongoDB\Driver\Cursor
O código de exemplo a seguir especifica os critérios de pesquisa para os documentos que queremos encontrar na collection
restaurants
do de dadossample_restaurants
. Para usar esse exemplo, consulte Conjuntos de dados de amostra disponíveis para Atlas clusters.1 2 3 // 4 // This example uses data from the Sample Datasets in MongoDB Atlas 5 // To load, and use this sample data, see https://docs.atlas.mongodb.com/sample-data/available-sample-datasets/ 6 // 7 8 require_once __DIR__ . '/vendor/autoload.php'; 9 $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); 10 $dotenv->load(); 11 12 $client = new MongoDB\Client( 13 'mongodb+srv://'.$_ENV['MDB_USER'].':'.$_ENV['MDB_PASS'].'@'.$_ENV['ATLAS_CLUSTER_SRV'].'/sample_restaurants' 14 ); 15 16 $collection = $client->sample_restaurants->restaurants; 17 18 $cursor = $collection->find( 19 [ 20 'cuisine' => 'Italian', 21 'borough' => 'Manhattan', 22 ], 23 [ 24 'limit' => 5, 25 'projection' => [ 26 'name' => 1, 27 'borough' => 1, 28 'cuisine' => 1, 29 ], 30 ] 31 ); 32 33 foreach ($cursor as $restaurant) { 34 var_dump($restaurant); 35 };
Você deverá ver algo semelhante à seguinte saída:
1 object(MongoDB\Model\BSONDocument)#20 (1) { 2 ["storage":"ArrayObject":private]=> 3 array(4) { 4 ["_id"]=> 5 object(MongoDB\BSON\ObjectId)#26 (1) { 6 ["oid"]=> 7 string(24) "5eb3d668b31de5d588f42965" 8 } 9 ["borough"]=> 10 string(9) "Manhattan" 11 ["cuisine"]=> 12 string(7) "Italian" 13 ["name"]=> 14 string(23) "Isle Of Capri Resturant" 15 } 16 } 17 object(MongoDB\Model\BSONDocument)#19 (1) { 18 ["storage":"ArrayObject":private]=> 19 array(4) { 20 ["_id"]=> 21 object(MongoDB\BSON\ObjectId)#24 (1) { 22 ["oid"]=> 23 string(24) "5eb3d668b31de5d588f42974" 24 } 25 ["borough"]=> 26 string(9) "Manhattan" 27 ["cuisine"]=> 28 string(7) "Italian" 29 ["name"]=> 30 string(18) "Marchis Restaurant" 31 } 32 } 33 object(MongoDB\Model\BSONDocument)#26 (1) { 34 ["storage":"ArrayObject":private]=> 35 array(4) { 36 ["_id"]=> 37 object(MongoDB\BSON\ObjectId)#20 (1) { 38 ["oid"]=> 39 string(24) "5eb3d668b31de5d588f42988" 40 } 41 ["borough"]=> 42 string(9) "Manhattan" 43 ["cuisine"]=> 44 string(7) "Italian" 45 ["name"]=> 46 string(19) "Forlinis Restaurant" 47 } 48 } 49 object(MongoDB\Model\BSONDocument)#24 (1) { 50 ["storage":"ArrayObject":private]=> 51 array(4) { 52 ["_id"]=> 53 object(MongoDB\BSON\ObjectId)#19 (1) { 54 ["oid"]=> 55 string(24) "5eb3d668b31de5d588f4298c" 56 } 57 ["borough"]=> 58 string(9) "Manhattan" 59 ["cuisine"]=> 60 string(7) "Italian" 61 ["name"]=> 62 string(22) "Angelo Of Mulberry St." 63 } 64 } 65 object(MongoDB\Model\BSONDocument)#20 (1) { 66 ["storage":"ArrayObject":private]=> 67 array(4) { 68 ["_id"]=> 69 object(MongoDB\BSON\ObjectId)#26 (1) { 70 ["oid"]=> 71 string(24) "5eb3d668b31de5d588f42995" 72 } 73 ["borough"]=> 74 string(9) "Manhattan" 75 ["cuisine"]=> 76 string(7) "Italian" 77 ["name"]=> 78 string(8) "Arturo'S" 79 } 80 }
A atualização de documentos envolve usar o que aprendemos na seção anterior para encontrar e transmitir os parâmetros necessários para especificar as alterações que gostaríamos que fossem refletidas nos documentos que correspondam ao critério específico.
Há dois comandos específicos no vocabulário do driver PHP que nos permitirão
update
documentos.MongoDB\Collection::updateOne
- Atualize, no máximo, um documento que corresponda aos critérios de filtro. Se vários documentos corresponderem aos critérios de filtro, somente o primeiro documento correspondente será atualizado.MongoDB\Collection::updateMany
- Atualize todos os documentos que correspondem aos critérios de filtro.
Esses dois funcionam de maneira muito semelhante, com a exceção óbvia em torno do número de documentos afetados.
Vamos começar com
MongoDB\Collection::updateOne
. A amostra de códigoa seguir encontra um único documento com base em um conjunto de critérios que passamos em um documento e nos valores$set
nesse único documento.1 2 3 require_once __DIR__ . '/vendor/autoload.php'; 4 $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); 5 $dotenv->load(); 6 7 $client = new MongoDB\Client( 8 'mongodb+srv://'.$_ENV['MDB_USER'].':'.$_ENV['MDB_PASS'].'@'.$_ENV['ATLAS_CLUSTER_SRV'].'/sample_restaurants' 9 ); 10 11 $collection = $client->sample_restaurants->restaurants; 12 13 $updateResult = $collection->updateOne( 14 [ 'restaurant_id' => '40356151' ], 15 [ '$set' => [ 'name' => 'Brunos on Astoria' ]] 16 ); 17 18 printf("Matched %d document(s)\n", $updateResult->getMatchedCount()); 19 printf("Modified %d document(s)\n", $updateResult->getModifiedCount());
Você deverá ver algo semelhante à seguinte saída:
1 Matched 1 document(s) 2 Modified 1 document(s)
Agora, vamos explorar a atualização de vários documentos em uma única execução de comando.
A seguinte amostra de código atualiza todos os documentos com o bairro de "Queens", definindo o campo ativo como verdadeiro:
1 2 3 require_once __DIR__ . '/vendor/autoload.php'; 4 $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); 5 $dotenv->load(); 6 7 $client = new MongoDB\Client( 8 'mongodb+srv://'.$_ENV['MDB_USER'].':'.$_ENV['MDB_PASS'].'@'.$_ENV['ATLAS_CLUSTER_SRV'].'/sample_restaurants' 9 ); 10 11 $collection = $client->sample_restaurants->restaurants; 12 13 $updateResult = $collection->updateMany( 14 [ 'borough' => 'Queens' ], 15 [ '$set' => [ 'active' => 'True' ]] 16 ); 17 18 printf("Matched %d document(s)\n", $updateResult->getMatchedCount()); 19 printf("Modified %d document(s)\n", $updateResult->getModifiedCount());
Você deverá ver algo semelhante a isto:
1 Matched 5656 document(s) 2 Modified 5656 document(s)
Ao atualizar dados em seu MongoDB database, é importante considerar
write concern
. A write concern descreve o nível de confirmação solicitado ao MongoDB para operações de escrita em mongod
standalone, conjuntos de réplicas ou clusters fragmentados.Para entender o valor atual da write concern, tente o seguinte código de exemplo:
1 $collection = (new MongoDB\Client)->selectCollection('test', 'users', [ 2 'writeConcern' => new MongoDB\Driver\WriteConcern(1, 0, true), 3 ]); 4 5 var_dump($collection->getWriteConcern());
Consulte https://docs.mongodb.com/manual/reference/write-concern/ para obter mais informações sobre write concern.
Assim como na atualização e localização de documentos, você pode excluir um único documento ou vários documentos do banco de dados.
MongoDB\Collection::deleteOne
- Exclui, no máximo, um documento que corresponda aos critérios de filtro. Se vários documentos corresponderem aos critérios de filtro, somente o primeiro documento correspondente será excluído.MongoDB\Collection::deleteMany
- Exclui todos os documentos que correspondem aos critérios de filtro.
Vamos começar excluindo um único documento.
A seguinte amostra de código exclui um documento na collection de usuários que tem "ny" como o valor do campo de estado:
1 2 3 // 4 // This example uses data from the Sample Datasets in MongoDB Atlas 5 // To load, and use this sample data, see https://docs.atlas.mongodb.com/sample-data/available-sample-datasets/ 6 // 7 8 require_once __DIR__ . '/vendor/autoload.php'; 9 $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); 10 $dotenv->load(); 11 12 $client = new MongoDB\Client( 13 'mongodb+srv://'.$_ENV['MDB_USER'].':'.$_ENV['MDB_PASS'].'@'.$_ENV['ATLAS_CLUSTER_SRV'].'/sample_restaurants' 14 ); 15 16 $collection = $client->sample_restaurants->restaurants; 17 18 $deleteResult = $collection->deleteOne(['cuisine' => 'Hamburgers']); 19 20 printf("Deleted %d document(s)\n", $deleteResult->getDeletedCount());
Você deverá ver algo semelhante à seguinte saída:
1 Deleted 1 document(s)
Você notará, se examinar o banco de dados
sample_restaurants
, que há muitos documentos correspondentes aos critérios { "cuisine": "Hamburgers" }
. No entanto, apenas um documento foi excluído.A exclusão de vários documentos é possível usando
MongoDB\Collection::deleteMany
. O exemplo de código a seguir mostra como usar odeleteMany
.1 2 3 // 4 // This example uses data from the Sample Datasets in MongoDB Atlas 5 // To load, and use this sample data, see https://docs.atlas.mongodb.com/sample-data/available-sample-datasets/ 6 // 7 8 require_once __DIR__ . '/vendor/autoload.php'; 9 $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); 10 $dotenv->load(); 11 12 $client = new MongoDB\Client( 13 'mongodb+srv://'.$_ENV['MDB_USER'].':'.$_ENV['MDB_PASS'].'@'.$_ENV['ATLAS_CLUSTER_SRV'].'/sample_restaurants' 14 ); 15 16 $collection = $client->sample_restaurants->restaurants; 17 $deleteResult = $collection->deleteMany(['cuisine' => 'Hamburgers']); 18 19 printf("Deleted %d document(s)\n", $deleteResult->getDeletedCount());
Você deverá ver algo semelhante à seguinte saída:
432 documentos excluídos
Se você executar isso várias vezes, sua saída obviamente será diferente. Isso ocorre porque você pode ter removido ou excluído documentos de execuções anteriores. Se, por algum motivo, você quiser restaurar seus dados de amostra, visite: https://docs.atlas.mongodb.com/sample-data/available-sample-datasets/ para obter instruções sobre como fazer isso.
Os conceitos básicos de qualquer idioma geralmente são esclarecidos por meio do processo de criação, leitura, atualização e exclusão de dados. Neste artigo, analisamos os fundamentos do CRUD com PHP e MongoDB. No próximo artigo da série, colocaremos esses princípios em prática com uma aplicação do mundo real.
A criação ou inserção de documentos é realizada por meio de:
A leitura ou localização de documentos é realizada usando:
A atualização de documentos é realizada por meio do uso de:
A exclusão ou remoção de documentos é realizada usando:
Dúvidas? Comentários? Queremos muito interagir com você. Participe da conversa nos fóruns da MongoDB Community.
- Documentação do driver MongoDB PHP fornece documentação completa que descreve como usar PHP com seu cluster do MongoDB.
- A documentação do documento de query do MongoDB detalha todo o poder disponível para consultar as coleções do MongoDB.